2

我们使用find-sec-bugs和 findbugs 来查找代码中的潜在问题。我们使用 Spring JDBCTemplate 进行数据库访问,并且find-sec-bugs似乎认为我们到处都有 SQL 注入漏洞。最简单的例子如下:

public class MyDataRepo {
    private final String getDataSql;

    public PilotRepositoryImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        getDataSql = "SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?";
        //...
    }

    public MyData getMyData(String companyId, UUID userId)
    {
        return jdbcTemplate.queryForObject(getDataSql, new Object[]{companyId, userId}, myDataRowMapper);
    }
}

这导致它认为它容易受到 SQL 注入的影响,但显然不是(如果我错了,请纠正我)。

如果我将字符串直接复制并粘贴到这样的方法中:

return jdbcTemplate.queryForObject("SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?", new Object[]{companyId, userId}, myDataRowMapper);

然后它认为它很好。我喜欢在课堂顶部定义 SQL,而不是埋在每个方法中。我真的不想@SuppressFBWarnings到处添加,因为这几乎违背了目的。

有没有更好的方法来解决这个问题?我们正在做的事情真的有问题吗?

4

2 回答 2

0

代码是安全的。FSB 目前无法识别读取的字段是最终字段并且其来源是安全的。

当这个问题得到修复时,这个误报最终将被忽略:https ://github.com/find-sec-bugs/find-sec-bugs/issues/385 。

于 2018-11-13T21:52:10.600 回答
0

我喜欢在课堂顶部定义 SQL,而不是埋在每个方法中。

尝试使用静态方法而不是字段。

public class MyDataRepo {

    private static String getDataSql() {
        return "SELECT ID, FIRST_NAME, LAST_NAME, USERNAME, EMAIL FROM USERS WHERE COMPANY_ID = ? AND ID = ?"
    }

    public PilotRepositoryImpl(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
        //...
    }

    public MyData getMyData(String companyId, UUID userId) {
        return jdbcTemplate.queryForObject(getDataSql(), new Object[]{companyId, userId}, myDataRowMapper);
    }
}

这导致它认为它容易受到 SQL 注入的影响,但显然不是(如果我错了,请纠正我)。

我不反对,但更广泛的范围可能会招致更多的攻击媒介。

于 2017-08-22T21:52:05.917 回答