【问题标题】: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 注入攻击?

【问题讨论】:

    标签: jpa orm sql-injection jpql


    【解决方案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

    【讨论】:

    【解决方案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”开头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多