代码之家  ›  专栏  ›  技术社区  ›  Akshay

JPA中是否可能有SQL注入攻击?

  •  37
  • Akshay  · 技术社区  · 15 年前

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

    后端是mysql,但我已经在ejb-ql中为所有操作使用了entitymanager函数和命名查询。在这种情况下,是否可能发生SQL注入攻击?

    4 回复  |  直到 7 年前
        1
  •  37
  •   BalusC    15 年前

    只有在像这样的SQL/JPQL字符串中嵌入用户控制变量时,才有可能:

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

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

        2
  •  11
  •   Jonas    15 年前

    是的,这是可能的。这取决于您实现的方式。
    看一看 Preventing injection in JPA query language .

        3
  •  5
  •   Doug Clarke    15 年前

    如果您的JPA提供者处理所有输入参数来处理注入攻击,那么您应该被覆盖。我们在EclipseLink上做的很薄。

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

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

    道格

        4
  •  0
  •   hantwister    7 年前

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

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

    如果受害者使用的是JPA实现>=2.1,而后端数据库是Oracle,则上述类似的操作可能会充当一个布尔SQL注入,告诉您数据库用户是否以“a”开头。