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注入 。
备注:
这篇文章摘抄来自网络 。 我打算总结一些列架构师需要的优秀文章 , 由于自己写会花太多时间 , 我决定做一个搬运工 , 为大家筛选优秀的文章 , 最后我会做成索引方便大家查找 。
推荐阅读
- FlinkSQL 动态加载 UDF 实现思路
- 基于Spring+Angular9+MySQL开发平台
- 与华为同行,鸿雁智能为HiLink生态注入新活力
- MySQL数据库数据归档回收工具使用场景分享-爱可生
- 实践中如何优化MySQL(建议收藏!)
- 白帽子:SQL注入之双查询注入
- 面试官问:MySQL 的自增 ID 用完了,怎么办?
- FLASK数据库模型
- 零散的MySql基础记不住,看这一篇就够啦
- MySQL性能优化——Explain使用分析