java - Java中order by子句的SQL注入(inject)漏洞

标签 java sql spring jdbc

Veracode 报告显示以下查询存在 SQL 注入(inject)缺陷。我需要一些参数来获取属性文件,然后需要将其注入(inject)到我的 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());

最佳答案

对于列值,您应该使用准备好的语句。它使得注入(inject)变得不可能。示例:

jdbcTemplate.query("Select * from user where id=?"), new PreparedStatementSetter() {
            public void setValues(PreparedStatement preparedStatement) throws SQLException
            {
                preparedStatement.setLong(1, id);
            }
        }, new ResultSetExtractor<User>() {
...                
}});

不幸的是,对于列名、模式名等,您只能使用串联或替换方法:

"SELECT quantity from $tableName where event_id=?".replace("$tableName", "myTable")

您应该了解的主要事情是注入(inject)来自最终用户,如果这些架构名称、表名称等是内部信息,最终用户无法更改它。所以你不应该害怕 SQL 注入(inject)。

关于java - Java中order by子句的SQL注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461350/

相关文章:

php - 使用 php 和 mysql 的登录页面无法正常工作

sql - row_number() 如何工作?

spring - 如何使用spring将编码后的base64图像上传到服务器

PHP/SQL : ORDER BY or sort($array)?

java - Spring Cloud Gateway 的 LDAP 身份验证

Spring LDAP 示例需要持久性吗?

java - 可变长度参数可以替代一维数组吗?

java - menuitem.getmenuinfo() 为动态创建的 View 返回 null

java - 我应该使用什么事件来检测自定义 JComponent 中父 JFrame 的关闭?

java - 在 ubuntu 11.04 上运行 selenium xvfb