网络安全Java代码审计实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1.6 SQL注入漏洞修复

对于SQL注入漏洞,最有效的防御手段便是进行预编译处理,在Java的JDBC中提供了强大的预处理方法供开发人员选择。当然,除了原生的JDBC,开发人员同样可以选择Druid、MyBatis等。

使用预编译处理不仅可以防范SQL注入攻击,而且能够提高执行速度。下面我们将针对上方的Demo使用PreparedStatement进行预编译处理,以达到防范SQL注入攻击的目的。

典型代码示例:

完成驱动注册后,实例化PreparedStatement对象,SQL语句为“SELECT*FROM user WHERE id=?”,然后通过“preparedStatement.setInt(1,id)”传入id的值,id的值在开始时通过“String id="1 or 1=1"”设置为“1 or 1=1”,因为PreparedStatement预编译可以有效地防止SQL注入攻击,当运行此代码后,输出的是“id:1 username:user1 password:pass1”,并没有注入成功和获取到所有的信息,如图2-39所示。

图2-39 注入失败

当然,预编译也不是万能的,否则就不会出现这么多的SQL注入漏洞。如前面讲到的order by后面的语句,是不能够用预编译进行处理的,只能通过拼接进行操作,因此需要手动过滤。

当然,除了使用预编译的方法来避免SQL注入,我们也可以使用类型转换等方式进行防范。如在第一个演示Demo中已知id参数的值应为数字而不是其他类型,那么我们只需对id参数进行强制类型转换,将其转换为Int型即可避免SQL注入的产生。