在 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 JdbcTemplate详解

Spring JdbcTemplate详解

SpringJDBCTemplate

spring-boot实战12:Spring Boot中使用JavaMailSender发送邮件

Spring Boot:在Spring Boot中使用Mysql和JPA

在 spring-boot 项目中使用 spring mvc xml 项目