在 Spring Boot 中使用 jdbcTemplate 执行具有动态占位符的 HANA 查询
Posted
技术标签:
【中文标题】在 Spring Boot 中使用 jdbcTemplate 执行具有动态占位符的 HANA 查询【英文标题】:HANA query with dynamic placeholder executed using jdbcTemplate in Spring Boot 【发布时间】:2022-01-08 03:11:23 【问题描述】:我有一些依赖于PLACEHOLDER
输入的 HANA 查询。对此的输入当前是硬编码的,这导致 Veracode 检测到 SQL 注入漏洞。
为了解决这个问题,我尝试使用PreparedStatement
参数化赋予PLACEHOLDER
的值,但出现以下错误:
PreparedStatementCallback; uncategorized SQLException for SQL [SELECT * FROM some_table (PLACEHOLDER.\"$$<IP_SOME_COLUMN>$$\" => ?) WHERE some_flag = ?; ]; SQL state [HY000]; error code [2048]; SAP DBTech JDBC: [2048]: column store error: search table error: [34023] Instantiation of calculation model failed;exception 306002: An internal error occurred\n; nested exception is com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: [2048]: column store error: search table error: [34023] Instantiation of calculation model failed;exception 306002: An internal error occurred
我已经检查了this 解决方案并查看了documentation 以获取 SAP HANA 中的输入参数。以下是我的代码:
String sqlQuery = SELECT * FROM some_table ( PLACEHOLDER.\"$$<IP_SOME_COLUMN>$$\" => ? ) WHERE some_flag = ? ;
PreparedStatementSetter preparedStatementSetter = (PreparedStatement ps) ->
ps.setString(1, firstInput);
ps.setString(2, secondInput);
ResultSetExtractor<T> rse = new DataResultSetExtractor();
getJdbcTemplate().query(sqlQuery, preparedStatementSetter, rse);
同样适用于硬编码方式(易于 SQL 注入):
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM some_table ").append("( 'PLACEHOLDER' = ('$$IP_SOME_COLUMN$$',").append(firstColumnValue).append("))");
//Map<String,Object> paramMap = new HashMap<String,Object>();
//getNamedParameterJdbcTemplate().query(sql.toString(), paramMap, rse);
如何解决这个错误?
【问题讨论】:
【参考方案1】:解决了这个问题。看来,在新语法中,您需要在单引号中提供输入参数,而不是在三个单引号中
作品:'foo'
不起作用:'''bar'''
【讨论】:
以上是关于在 Spring Boot 中使用 jdbcTemplate 执行具有动态占位符的 HANA 查询的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot实战12:Spring Boot中使用JavaMailSender发送邮件