MyBatis动态表名或动态排序直接使用${}而引发SQL注入安全漏洞的修复解决方案

MyBatis能用#{}尽量用#{},而本文主要解决必须要用${ }的情况下,如何解决${}导致的SQL注入安全漏洞修复

安全风险分析

造成 SQL Injection 漏洞的根本原因在于攻击者可以更改 SQL 查询的上下文,导致程序员原本要作为数据解释的数值却被解释为命令。构造 SQL 查询后,程序员知道哪些字符应作为命令解释,哪些字符应作为数据解释。参数化 SQL 语句可以防止直接窜改上下文,避免几乎所有的 SQL Injection 攻击。参数化 SQL 语句是用常规的 SQL 字符串构造的,但是当需要添加用户提供的数据时,它们就需要使用捆绑参数,这些捆绑参数是一些占位符,用来存放随后插入的数据。换言之,捆绑参数可以使程序员明确告知数据库哪些字符应被视为命令,哪些字符应被视为数据。这样,当程序准备执行某个语句时,它可以为数据库指定每一个捆绑参数所使用的运行时值,而不会存在数据被篡改为命令的风险。

危险代码示例

  1. 动态表名查询代码

select * from ${tablename}

  1. 动态删除代码

delete from ${tablename}

  1. 动态字段排序

select * from xxx order by ${fieldName}

  1. 删除表

drop t

猜你喜欢

转载自blog.csdn.net/eguid_1/article/details/131826859