我们在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
,因为这几乎违背了目的。
有没有更好的方法解决这个问题?我们正在做的事情有什么问题吗?
答案 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。