MyBatis能用#{}
尽量用#{}
,而本文主要解决必须要用${ }
的情况下,如何解决${}
导致的SQL注入安全漏洞修复
安全风险分析
造成 SQL Injection 漏洞的根本原因在于攻击者可以更改 SQL 查询的上下文,导致程序员原本要作为数据解释的数值却被解释为命令。构造 SQL 查询后,程序员知道哪些字符应作为命令解释,哪些字符应作为数据解释。参数化 SQL 语句可以防止直接窜改上下文,避免几乎所有的 SQL Injection 攻击。参数化 SQL 语句是用常规的 SQL 字符串构造的,但是当需要添加用户提供的数据时,它们就需要使用捆绑参数,这些捆绑参数是一些占位符,用来存放随后插入的数据。换言之,捆绑参数可以使程序员明确告知数据库哪些字符应被视为命令,哪些字符应被视为数据。这样,当程序准备执行某个语句时,它可以为数据库指定每一个捆绑参数所使用的运行时值,而不会存在数据被篡改为命令的风险。
危险代码示例
- 动态表名查询代码
select * from ${tablename}
- 动态删除代码
delete from ${tablename}
- 动态字段排序
select * from xxx order by ${fieldName}
- 删除表
drop t