BLOCKER-将此代码更改为不直接从用户控制的数据构造SQL查询



Sonarqube给我这个错误:

[BLOCKER]将此代码更改为不直接从用户控制的数据构造SQL查询

这是我的代码:

String countSQL;
countSQL = (String.format("SELECT count(*) as total FROM ltid_owner.enty %s",additionalWhereClauses));
jdbcTemplateTMI.queryForObject(countSQL, Integer.class);

在上面的代码中,additionalWhereClauses可能是如下所示的内容,当用户点击网格对不同的列执行过滤时,我正在动态构建:

additionalWhereClauses = where UPPER(enty_num) like '003%'

你能告诉我如何解决这个问题吗?

您的代码将字符串组合到SQL语句中。如果这些字符串中的任何一个包含用户提供的输入,则攻击者可以潜入代码以触发SQL注入攻击,并可能在您的计算机上运行任意代码(必须引用Bobby Tables(。

简单示例:

String sql = "SELECT * FROM users WHERE name = '" + name + "' AND password = '" + password + "'";

如果我输入' OR 1=1 --作为名称(输入"…"作为密码,但这已经不重要了(,代码就会变成一个有效的SQL语句:

SELECT *
FROM users 
WHERE name = '' OR 1=1 -- ' AND password = '...'

但是用户名/密码检查被完全禁用。

为了避免这种情况,请使用事先准备好的语句。他们构建SQL命令的方式使得SQL注入是不可能的。

也许这在你的代码中永远不会发生,因为你不接受用户输入,但Sonar不知道这一点(人类评审员也不会(。我总是使用事先准备好的陈述。仅仅因为你的代码只从前端传递列标题,并不意味着攻击者不能手动调用你的web服务端点并传递他们想要的任何内容,而是你的代码作为HTTP端点运行。

相关内容

  • 没有找到相关文章

最新更新