JAVA中带有order by子句的SQL注入漏洞

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,

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());

对于列值,应使用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抱怨的原因