在JPA中是否可以进行SQL注入攻击?

时间:2010-08-09 14:46:56

标签: jpa orm sql-injection jpql

我正在使用Java EE 6和JSF-2.0构建Java Web应用程序,使用持久性API进行所有数据库操作。

后端是MySQL,但是我在EJB-QL中使用了EntityManager函数和命名查询来进行所有操作。在这种情况下,SQL注入攻击是否可行?

4 个答案:

答案 0 :(得分:39)

只有在SQL / JPQL字符串中内联用户控制的变量时才有可能:

String sql = "SELECT u FROM User u WHERE id=" + id;

如果您不这样做并且仅使用参数化/命名查询,那么您就是安全的。

答案 1 :(得分:11)

是的,有可能。这取决于你实施的方式 看看Preventing injection in JPA query language

答案 2 :(得分:5)

如果您的JPA提供程序处理所有输入参数以处理注入攻击,那么您应该受到保护。我们在EclipseLink中做得很薄。

正如之前的海报提到的拼凑你自己的JPQL或SQL(对于本机查询)可能会暴露你。

我建议使用带有参数的命名查询而不是连接字符串来构建JPQL / SQL。

道格

答案 3 :(得分:0)

如果您从冒犯性/实践角度询问,如果JPQL语句是根据用户输入构建的,请考虑以下用户输入:

blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42

如果受害者正在使用JPA实现> = 2.1,并且后端数据库是Oracle,那么类似上面的内容可能会作为一个布尔SQL注入来告诉您数据库用户是否以“A”开头。