Java 此JPA查询易受SQL注入攻击吗?

Java 此JPA查询易受SQL注入攻击吗?,java,sql,jpa,sql-injection,Java,Sql,Jpa,Sql Injection,我有一个库,它根据调用方提供的JPA WHERE语句执行查询。我正在执行以下JPA查询: public void executeQuery(String jpaWhereStatement) { String queryString = "SELECT entity FROM " + MyEntity.class.getSimpleName() + " entity WHERE " + jpaWhereStatement; } 查询参数仍然是使用query.setParameter()插入的,

我有一个库,它根据调用方提供的JPA WHERE语句执行查询。我正在执行以下JPA查询:

public void executeQuery(String jpaWhereStatement) {
String queryString = "SELECT entity FROM " + MyEntity.class.getSimpleName() + " entity WHERE " + jpaWhereStatement;
}

查询参数仍然是使用
query.setParameter()
插入的,但我担心可能会允许SQL注入攻击。如果这是易受攻击的,如何修复此代码?

在不了解调用方的情况下,很难说。如果不小心生成where语句,则可能存在漏洞。总的来说,这种方法在我看来是个坏主意。我个人会更明确地说明如何生成WHERE子句并始终使用参数


作为一般规则,永远不要相信用于构造SQL语句的任何数据,无论它是来自客户机还是来自数据库

正如邦廷(以及亚当·比恩)所指出的,如果你坚持参数化查询,你应该是黄金。当然,如果您的实现中存在一般性漏洞,那么您可能会面临风险。

根据经验,当涉及用户输入或来自GET的输入时,请使用标准确保参数被转义。即,不要使用HQL

如果不涉及用户输入或get输入,则可以使用HQL


但是是的,如果使用
setParameter()
可能没有sql注入问题。

请参见:前两段我正要+1你,但在你最后一句话之后我不能。如果恶意用户可以操纵
jpaWhereStatement
,则使用
query.setParameter()
.Hmm插入其他查询参数并不重要。。我们中的一个误读了这个问题,如果构建了
jpaWhereStatement
,但字符串中没有插入值,则使用值的占位符,然后使用
Query
对象的
setParameter()
方法来设置值(正如我认为问题所暗示的那样),hibernate不应该逃避所有的输入吗?不会有威胁,我可能误解了这个问题。我的观点是,如果恶意用户有可能影响
jpaWhereStatement
的构造方式(最令人震惊的例子是
jpaWhereStatement
包含直接来自URL参数的文本,但至少在理论上可能会有更微妙的攻击),那么
setParameter()
还不够。如果用户可能接触到的每个字符串只影响
setParameter()
,而不影响
jpaWhereStatement
,那么您是对的,它可能是安全的。但我不确定这里的情况是否如此。