JPA 中是不是可能进行 SQL 注入攻击?
Posted
技术标签:
【中文标题】JPA 中是不是可能进行 SQL 注入攻击?【英文标题】:Are SQL injection attacks possible in JPA?JPA 中是否可能进行 SQL 注入攻击? 【发布时间】:2011-03-27 08:28:12 【问题描述】:我正在使用 Java EE 6 和 JSF-2.0 构建一个 Java Web 应用程序,并使用持久性 API 进行所有数据库操作。
后端是 mysql,但我使用 EJB-QL 中的 EntityManager 函数和命名查询进行所有操作。在这种情况下是否可能进行 SQL 注入攻击?
【问题讨论】:
【参考方案1】:只有当您像这样在 SQL/JPQL 字符串中内联用户控制的变量时才有可能:
String sql = "SELECT u FROM User u WHERE id=" + id;
如果您不这样做并且仅使用参数化/命名查询,那么您是安全的。
【讨论】:
如果使用em.persist(user);
,其中user
由错误用户填充?
这是否意味着以下查询是 SQL 注入证明? @Query("SELECT * from table where id = :userID") 用户 getUser (@Param("userID") String userID )【参考方案2】:
是的,这是可能的。这取决于您实施的方式。 看看Preventing injection in JPA query language。
【讨论】:
我也建议查看 SANS 文章,它有更多示例/介绍:software-security.sans.org/developer-how-to/…【参考方案3】:如果您的 JPA 提供程序处理所有输入参数以处理注入攻击,那么您应该被覆盖。我们在 EclipseLink 中做瘦。
正如之前的海报所提到的,将您自己的 JPQL 或 SQL(用于本机查询)拼凑在一起可能会让您暴露。
我建议使用带参数的命名查询而不是连接字符串来构建 JPQL/SQL。
道格
【讨论】:
【参考方案4】:如果您从冒犯/实用的角度提出问题,如果 JPQL 语句是根据用户输入构建的,请考虑以下用户输入:
blah') AND FUNCTION('user like chr(65)||chr(37) AND 42 - ', 1) > 40 AND ('42'='42
如果受害者使用 >= 2.1 的 JPA 实现,并且后端数据库是 Oracle,则类似上述的内容可能会充当布尔 SQL 注入来告诉您数据库用户是否以“A”开头。
【讨论】:
以上是关于JPA 中是不是可能进行 SQL 注入攻击?的主要内容,如果未能解决你的问题,请参考以下文章