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端点运行。