可能引发注入的场景
- SQL里面直接拼接了SQL
- 查询参数里面直接拼接SQL,没有做处理(直接把查询关键字拼到SQL里面了, 比如 name= ' OR 1=1 --'
- 相关的字段直接拼接SQL,没有做处理(根据自定义字段进行条件查询,Mybatis SQL拼接,或者JDBC原生的SQL拼接)
- 存错过程里面直接调用的SQL
解决方案
-
框架上做预处理(PreparedStatement、Mybatis #取参数、Hibernate)避免直接用外部传入值拼接SQL
-
如果必须拼接SQL时
- 做正则表达式匹配过滤,过滤关键字(delete 、update、 or、 drop、truncate等等)
- 如果有数据格式的话,先做一下格式验证,比如参数必须是int,那么check这个参数是否合法
- 不要在web端直接引用SQL语句,而是通过在后台根据条件进行转换,比如 字段值 =1 name字段,字段值 =2 age字段,那么传入到后台之后, 1 -->name, 2--> age,避免用户直接修改html代码来攻击
- Mysql高版本默认不支持多语句执行,但是配置了 &allowMultiQueries=true就要特别注意了,允许一句SQL语句后面拼接 update 、delete等语句。但是在存储过程的调用中,就需要额外注意了
- 在查询SQL的service方法里面添加 ReadOnly 的事务配置,避免修改数据的发生
网友评论