47

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

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

4

4 回答 4

54

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

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

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

于 2010-08-09T14:54:34.083 回答
12

是的,有可能。这取决于您实施的方式。
看看防止 JPA 查询语言中的注入

于 2010-08-09T14:50:47.977 回答
5

如果您的 JPA 提供程序处理所有输入参数以处理注入攻击,那么您应该被覆盖。我们在 EclipseLink 中做瘦。

正如之前的海报所提到的,将您自己的 JPQL 或 SQL(用于本机查询)拼凑起来可能会让您暴露。

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

道格

于 2010-08-09T15:26:59.973 回答
0

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

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

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

于 2018-05-01T22:13:23.707 回答