这可能是一个愚蠢的问题,但我没有看到文档中的任何内容明确指出标准查询是参数化的还是在引擎盖下注入保护的。Java/Hibernate标准查询API是否防止注入?
换句话说,是否像下面的谓词直接容易受到注入攻击?如果是这样,我该如何解决它?环顾文档我没有看到任何参数化或类似的选项。
criteriaBuilder.like(
root.get("prop"),
"%"+userInput+"%"
)
这可能是一个愚蠢的问题,但我没有看到文档中的任何内容明确指出标准查询是参数化的还是在引擎盖下注入保护的。Java/Hibernate标准查询API是否防止注入?
换句话说,是否像下面的谓词直接容易受到注入攻击?如果是这样,我该如何解决它?环顾文档我没有看到任何参数化或类似的选项。
criteriaBuilder.like(
root.get("prop"),
"%"+userInput+"%"
)
是,Hibernate使用参数化查询的标准*
证实了这一点最简单的方法,就是要激活SQL日志(设置org.hibernate.SQL类别DEBUG),你会看到hibernate产生的查询(并获取参数值,激活日志类别:org.hibernate.type为TRACE级别)。
*您可以手动编写sql部分(使用Restrictions.sqlRestriction("...")
)。如果您正在编写容易进行sql注入的sql,那么您的标准查询也会受到它的影响。
是的。
使用Criteria API与使用参数化PreparedStatements相同。唯一需要谨慎的事情不是连接查询字符串,或者是否真的需要非常小心。
你为什么在乎它是否参数化?你所关心的是是否存在注入漏洞。 – immibis
当然,够公平的。我只是这么说,因为参数化是首先想到的提供体面防御注入的一致方式,并且它将与API的结构保持一致。但是你是对的,他们的实现细节与结果并不直接相关,也没有直接询问的意义。我会重写我的问题。 –
我会假设任何*优质*库不允许SQL注入攻击,除非另有说明。但是,请注意,这仅适用于*优质*库。 Hibernate对我来说看起来很像,但我从来没有用过它。 – immibis