SQL注入( 二 )


Codec MYSQL_CODEC = new MySQLCodec(MySQLCodec.Mode.STANDARD);String query = "SELECT * FROM users WHERE username = '"+ ESAPI.encoder().encodeForSQL(MYSQL_CODEC, username) + "' AND password = '" + ESAPI.encoder().encodeForSQL(MYSQL_CODEC, password) + "'";【SQL注入】关于Mybatis防止sql注入
Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ } 。
使用#{ }是来防止SQL注入 , 使用${ }是用来动态拼接参数 。
如何排查出#
1. 检查是否有$号
如果你使用的是ide代码编辑器 , 那么可以通过全局搜索${ , 快速定位到使用${ }拼接SQL的语句 , 再去找到外部传入参数的入口 , 闭合sql证明即可 。
2. 检查是否有order by语句
同样的在搜索是否使用order by排序语句 , 如果有一步一步追踪是否有外部参数 , 未过滤就直接传递到order by语句里面来 。
为什么#{ }就安全
#{ } 就类似JDBC的预编译 , 所以安全 。 类似如下SQL语句:(JDBC预编译的原理)
使用 ${ }效果是:
select * from testtable where id="1" or true or id# 1后面就是被攻击者恶意构造的字符而使用#{ } 的效果是:
select * from testtable where id="1\" or true or id\""# 1后面就是被攻击者恶意构造的字符这样子就防止了Sql注入 。
备注:
这篇文章摘抄来自网络 。 我打算总结一些列架构师需要的优秀文章 , 由于自己写会花太多时间 , 我决定做一个搬运工 , 为大家筛选优秀的文章 , 最后我会做成索引方便大家查找 。


推荐阅读