前言
在 MyBatis 中,如果动态查询 SQL 语句是像 select * from ${tableName}
这样使用字符串拼接的方式来构建,其中的 ${tableName}
是动态传入的表名参数,存在被注入的安全风险。这种情况下,恶意用户可以通过构造特定的输入来注入恶意代码,从而执行未经授权的数据库操作。
具体来说,当用户能够控制动态 SQL 中的参数,并且这些参数没有经过正确的验证和处理时,就会存在注入风险。
如果 ${tableName}
参数直接从用户输入获取并拼接到 SQL 语句中,恶意用户可以通过在输入中添加 SQL 注入语句来改变 SQL 的逻辑,可能导致数据泄露、数据篡改或数据损失等危害。
危险sql示例
下面列举几种易被动态sql注入攻击的案例:
1、动态表名查询
动态表名查询危险sql示例
SELECT * FROM ${tableName}
危险动态表名查询sql被注入攻击的原理
假设存在user表。
那么${tableName}参数未经过过滤就被为设置为下面的字符串:
tableName =