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

问题描述 投票:0回答:2

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%'

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

java sonarqube jdbctemplate
2个回答
0
投票

您的代码将字符串组合成 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 端点运行。


-2
投票

这对我有用:

try {
    if (!sortingDateOrderBy.matches("")) {

    }

}
catch (Exception ex)
{
    throw(ex);
}
© www.soinside.com 2019 - 2024. All rights reserved.