Veracode报告显示以下查询的SQL注入漏洞。我需要获取属性文件的参数很少,然后需要注入我的sql,即模式名称,排序顺序等等。
我尝试将%s与String.format一起使用,但veraCode仍然将其显示为缺陷。对于参数,它很好,因为我使用了map但是对于模式和排序顺序,它仍然显示出一个缺陷。
解决此漏洞的方法是什么?
phoneLogsQuery = "(select * from %s.SHORETEL_EVENTS_CALL_LOGS where CONVERT( date, CallDateTime,112 ) > CONVERT( date, GETDATE()-%s,112) "
+ " and (CALLER_CONTACT_ID in (:contactId) or CALLED_CONTACT_ID in (:contactId)) and EXTERNAL_CALL = 1 "
+ "UNION "
+ "select * from %s.SHORETEL_EVENTS_CALL_LOGS where CONVERT( date, CallDateTime,112 ) > CONVERT( date, GETDATE()-%s,112) "
+ " and (CALLER_CONTACT_ID in (:contactId) or CALLED_CONTACT_ID in (:contactId))"
+ " and GUILOGIN_NAME = :guiloginName and EXTERNAL_CALL = 0)"
+ " order by CallDateTime %s %s ";
phoneLogsQuery = String.format(phoneLogsQuery, schemaname, phoneLogAllData, schemaname, phoneLogAllData, sortDir, offsetQuery);
shoretelPhoneLogRow = jdbcTemplate.query(phoneLogsQuery,params,
new ShoretelPhoneLogMapper());
答案 0 :(得分:0)
对于列值,您应该使用预准备语句。它使注射成为不可能。例如:
jdbcTemplate.query("Select * from user where id=?"), new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException
{
preparedStatement.setLong(1, id);
}
}, new ResultSetExtractor<User>() {
...
}});
不幸的是,对于列名,模式名称等,您只能使用concatination或replace方法:
"SELECT quantity from $tableName where event_id=?".replace("$tableName", "myTable")
您应该了解的主要内容是注入来自最终用户,如果这些模式名称,表名称等是内部信息,则最终用户无法更改它。所以你不应该害怕sql注入。
答案 1 :(得分:0)
这些值中的大多数遗憾地无法通过预处理语句进行插值,这意味着您将不得不进行自己的转义。不确定Veracode是否足够智能来检测它,但我会从apache commons lang StringEscapeUtils.escapeSql
开始
答案 2 :(得分:0)
修复SQL注入的基本前提是不直接使用您的请求对象,而是首先清理,验证和创建新对象/引用(如果需要),然后从该已清理对象中获取值。
因此,只需创建一个方法来对santize,validate&amp;获取您希望为order by子句附加的值,并使用该值而不是直接来自请求。
如果您没有直接从未经过清理的请求中获取值,那么append
StringBuilder
就可以了。
在我看来,您似乎直接从请求中获取了%s,这就是Veracode抱怨的原因。