SQL注入jdbcTemplate

SQL Injection jdbcTemplate

提问人:sandy 提问时间:2/15/2023 最后编辑:Vladimir Shefersandy 更新时间:4/12/2023 访问量:630

问:

select ID from USER where ID is not null order by ID

Tenacity 将 SQl 注入视为高漏洞。

我尝试解决如下:

String sql = "select ID from user where :id is not null order by ID";
NamedParameterJdbcTemplate jdbcNamesTpl = new NamedParameterJdbcTemplate(this.jdbcTemplate);
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("id", "ID");
jdbcNamesTpl.query(sql,parameters,mapper);

但是我得到了所有记录以及空值。有人分享想法或任何建议来解决吗?

java sql 注入

评论

0赞 Gaël J 2/15/2023
固定的 SQL 查询(您展示的第一个查询)如何容易受到 SQL 注入的攻击?或者也许我不明白你在说什么。
0赞 sandy 2/15/2023
是的,第一个容易受到 SQL 注入的影响。我尝试使用 NamedParameterJdbcTemplate 来解决 SQL 注入问题,但它没有给出正确的结果。
2赞 chris 2/15/2023
仅当查询实际动态生成时,参数化语句才会修复 SQL 注入,而原始查询并非如此。所以你的代码分析工具似乎是错误的。
0赞 chris 2/15/2023
你用的是什么SQL方言?在某些 SQL 方言中,user 和/或 ID 可能是关键字。这可能与您收到的(可能是误导性的)警告有关。您可以转义可能与关键字混淆的标识符,但确切的语法取决于您使用的 DBMS。SQL Server:方括号(例如 、);MySQL:反引号(例如'user','ID'),PostgreSQL:双引号(例如,),...[user][ID]"user""ID"
0赞 sandy 2/15/2023
我在此处使用不同的表名和列名更新了查询。我在我的项目中使用不同的表和列

答:

0赞 Egret 2/18/2023 #1

似乎正在使用 Spring NamedParameterJdbcTemplate - 正如人们指出的那样,这似乎使用了参数化查询,这应该是安全的。

Tenacity 可能会感到困惑,因为命名参数与列相同 - 并且它认为您在 order by 子句中使用了命名参数(这将是潜在的 SQL 注入)。尝试将参数的名称更改为不是列名称的名称。