JAVA中带有order by子句的SQL注入漏洞
Veracode报告显示以下查询的SQL注入缺陷。有几个参数需要我获取属性文件,然后需要注入到我的sql中,即模式名、排序顺序..等等 我尝试将%s与String.format一起使用,但veraCode仍将其显示为一个缺陷。对于参数,它是好的,因为我使用了map,但是对于模式和排序顺序,它仍然显示出一个缺陷 有没有解决此漏洞的方法JAVA中带有order by子句的SQL注入漏洞,java,sql,spring,jdbc,Java,Sql,Spring,Jdbc,Veracode报告显示以下查询的SQL注入缺陷。有几个参数需要我获取属性文件,然后需要注入到我的sql中,即模式名、排序顺序..等等 我尝试将%s与String.format一起使用,但veraCode仍将其显示为一个缺陷。对于参数,它是好的,因为我使用了map,但是对于模式和排序顺序,它仍然显示出一个缺陷 有没有解决此漏洞的方法 phoneLogsQuery = "(select * from %s.SHORETEL_EVENTS_CALL_LOGS where CONVERT( date,
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());
对于列值,应使用prepared语句。它使注射变得不可能。例如:
jdbcTemplate.query("Select * from user where id=?"), new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException
{
preparedStatement.setLong(1, id);
}
}, new ResultSetExtractor<User>() {
...
}});
您应该理解的主要一点是,注入来自最终用户,如果那些模式名、表名等是内部信息,最终用户就不能更改它。所以您不应该害怕sql注入。对于列值,您应该使用prepared语句。它使注射变得不可能。例如:
jdbcTemplate.query("Select * from user where id=?"), new PreparedStatementSetter() {
public void setValues(PreparedStatement preparedStatement) throws SQLException
{
preparedStatement.setLong(1, id);
}
}, new ResultSetExtractor<User>() {
...
}});
您应该理解的主要一点是,注入来自最终用户,如果那些模式名、表名等是内部信息,最终用户就不能更改它。因此,您不应该害怕sql注入。遗憾的是,这些值中的大多数不能由准备好的语句进行插值,这意味着您将不得不自己进行转义。不确定Veracode是否足够聪明,可以检测到它,但我会选择ApacheCommonsLang中的
StringEscapeUtils.escapeSql
不幸的是,这些值中的大多数不能由预先准备好的语句插入,这意味着您必须自己进行转义。不确定Veracode是否足够聪明,可以检测到它,但我会选择ApacheCommons lang中的StringEscapeUtils.escapeSql修复SQL注入的基本前提是不直接使用请求对象,而是首先清理、验证和创建新对象/引用(如果需要)然后从该净化对象获取值
所以,只需创建一个方法来调整、验证和获取您希望附加到ORDERBY子句中的值,并使用该值,而不是直接从请求中获取
如果您不直接从未清理的请求中获取值,则使用StringBuilder
添加append
就可以了
在我看来,您似乎直接从请求中获得了%s,这就是Veracode抱怨的原因 修复SQL注入的基本前提是不直接使用请求对象,而是首先清理、验证和创建新对象/引用(如果需要),然后从清理后的对象获取值 所以,只需创建一个方法来调整、验证和获取您希望附加到ORDERBY子句中的值,并使用该值,而不是直接从请求中获取 如果您不直接从未清理的请求中获取值,则使用
StringBuilder
添加append
就可以了
在我看来,您似乎直接从请求中获得了%s,这就是Veracode抱怨的原因