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 端点运行。
这对我有用:
try {
if (!sortingDateOrderBy.matches("")) {
}
}
catch (Exception ex)
{
throw(ex);
}