来自find-sec-bugs

时间:2017-08-21 22:41:35

标签: sql-injection spring-jdbc findbugs find-sec-bugs

我们在findbugs中使用find-sec-bugs来查找代码中的潜在问题。我们使用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,因为这几乎违背了目的。

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

2 个答案:

答案 0 :(得分: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注入的攻击,这显然不是(如果我错了请纠正我)。

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

答案 1 :(得分:0)

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

此问题得到解决后,最终会被忽略:https://github.com/find-sec-bugs/find-sec-bugs/issues/385