为了避免SQL注入攻击的产生,需要严格检查请求参数的合法性或使用预编译,请参考JDBC章节中的JDBC SQL注入防御方案。

5.1 RASP SQL注入防御

在Java中,所有的数据库读写操作都需要使用JDBC驱动来实现,JDBC规范中定义了数据库查询的接口,不同的数据库厂商通过实现JDBC定义的接口来实现数据库的连接、查询等操作。
RASP是基于行为的方式来实现SQL注入检测的,如果请求的参数最终并没有被数据库执行,那么RASP的SQL注入检测模块根本就不会被触发。

5.1.1 java.sql.Connection/Statement接口Hook

虽然每种数据库的驱动包的类名都不一样,但是它们都必须实现JDBC接口,所以我们可以利用这一特点,使用RASP Hook JDBC数据库查询的接口类:java.sql.Connectionjava.sql.Statement
例如Mysql的驱动包的实现数据库连接的实现类是:com.mysql.jdbc.ConnectionImpl,该类实现了com.mysql.jdbc.MySQLConnection接口,而com.mysql.jdbc.MySQLConnection类是java.sql.Connection的子类,也就是说com.mysql.jdbc.ConnectionImpl接口必须实现java.sql.Connection定义的数据库连接和查询方法。
示例 - com.mysql.jdbc.ConnectionImpl 类继承关系图:
6. 5. SQL注入修复 - 图1