2012-04-06 64 views
5

正如我在很多文章中读到的,当我使用JPA/Hibernate查询时,在我的查询中设置参数是很好的,所以可以避免SQL注入。像:JPA查询 - 位置参数sql注入jpa本地查询

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 2012-04-06 19:33:52

回答

4

,如果你不使用字符串操作建立您的查询像

它们的参数,过滤输入,字符集的期待,存储过程和严格要求的组合
"SELECT foo FROM bar Where id="+myParameter+" more sql ..." 

,那么你将不会有任何漏洞。

1

目前(社区纠正我,如果我错了)最新的PDO数据库抽象层中不存在任何漏洞。

但是,在消毒和过滤输入时测试已知和未知的查询将有助于消除在零日漏洞事件中注入的可能性。

我目前使用在之前的任何和所有动态创建的查询