You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:11:11