gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:07 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com