JPA查询 - 位置参数中的SQL注入问题JPA原生查询

5

根据我阅读的许多文章,当我使用JPA/Hibernate查询时,最好在查询中设置参数,以避免SQL注入。例如:

select user from User user where user.name = :name and user.surname = :surname

我的问题在于,在某些情况下,我需要在创建查询时使用本地查询。

我会使用实体管理器和createNativeQuery。但在这种情况下,参数将是位置参数。例如:

select * from users where user_name = ? and user_surname = ?

那么在我的查询中,我将使用setParameter(1, "name") 等方法。那么这种情况是否像参数化查询一样是“SQL注入防护”呢?


1
是的,当使用setParameter方法时,它将正确地转义参数,以便仅用作数据。注入漏洞是由于使用用户提供的参数构建字符串并未正确转义而产生的。 - kevingallagher
2个回答

4

如果您不使用字符串操作来构建查询,比如

"SELECT foo FROM bar Where id="+myParameter+" more sql ..."

如果您的代码经过充分测试和审查,那么您就不会有任何漏洞。


1

目前(如果社区有误请纠正)最新的PDO数据库抽象层中不存在漏洞。

然而,在测试查询时,对已知和未知的内容进行消毒和过滤,将有助于消除零日攻击事件中注入的可能性。

我目前使用一种组合方式,即过滤输入、字符集期望、存储过程以及在动态创建查询之前对其参数进行严格要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接