Java/Hibernate 条件查询 API 是否可以防止注入?

Does the Java/Hibernate Criteria Query API Protect Against Injection?

这可能是个愚蠢的问题,但我在文档中没有看到任何内容明确说明条件查询是参数化的或在幕后以其他方式受注入保护。

换句话说,像下面这样的谓词是否直接容易受到注入攻击?如果是这样,我该如何解决?环顾文档,我没有看到任何参数化选项或类似的选项。

criteriaBuilder.like(
    root.get("prop"),
    "%"+userInput+"%"
)

是的,hibernate 正在对条件使用参数化查询*

确认这一点的最简单方法是激活 sql 日志记录(将 org.hibernate.SQL 类别设置为 DEBUG),您将看到休眠生成的查询(并获取参数值,激活日志类别:org.hibernate.type 到 TRACE 级别)。

*在条件中,您可以手写 sql 部分(使用 Restrictions.sqlRestriction("..."))。如果你写的 sql 容易被 sql 注入,你的标准查询也会受到影响。

是的。

使用 Criteria API 与使用参数化的 PreparedStatements 相同。您唯一需要注意的是不要连接查询字符串,或者如果确实需要,请非常非常小心。