Dremio结合Spring应用使用Prepared Statement失败,求助SQL注入防护方案
问题:Dremio + Arrow Flight JDBC 驱动下Prepared Statement不支持的问题及SQL注入防护方案
环境配置
我通过Spring Java应用,借助Dremio查询存储在S3中的Parquet文件,使用Apache Arrow SQL驱动,通过以下配置实例化DataSource并创建JdbcTemplate执行查询:
driver-class-name: org.apache.arrow.driver.jdbc.ArrowFlightJdbcDriver url: jdbc:arrow-flight-sql://localhost:32010/?useEncryption=false username: user password: pwd
现状与问题
字符串拼接方式(存在SQL注入风险)
最初我采用字符串拼接的方式将用户输入代入SQL语句,该方式可以正常运行,但存在严重的SQL注入风险:
"SELECT * FROM \"my-s3-storage\".table t WHERE t.description = '%s';".formatted(userInput)
Prepared Statement方式执行报错
尝试使用Prepared Statement来规避注入风险时,执行出现错误:
String sql = "SELECT * FROM \"my-s3-storage\".table t WHERE t.description = ?" jdbcTemplate.query(sql, ps -> ps.setString(1, userInput), rs -> { //处理结果集 });
错误信息如下:
cfjd.org.apache.arrow.flight.FlightRuntimeException: Cannot convert RexNode to equivalent Dremio expression. RexNode Class: org.apache.calcite.rex.RexDynamicParam, RexNode Digest: ?0
疑问与需求
- 网上查询到的信息存在矛盾:多年前的论坛评论称Dremio不支持Prepared Statement,但Dremio官方文档却推荐使用该方式
- 我了解到Dremio底层使用ANSI SQL,而ANSI SQL本身支持Prepared Statement,想确认这是否取决于数据库引擎而非SQL方言?并明确Dremio当前是否仍不支持Prepared Statement
- 若Dremio确实不支持Prepared Statement,除了转义危险字符、编码解码用户输入的方式外,希望获取其他无需依赖Prepared Statement的SQL注入防护建议
内容的提问来源于stack exchange,提问作者Bylaw
相关产品推荐
相关产品推荐

