【问题标题】:What are the differences between a JPQL-Injection and SQL-InjectionJPQL 注入和 SQL 注入之间有什么区别
【发布时间】:2019-07-03 14:47:54
【问题描述】:

我已阅读有关 JPQL 注入和 SQL 注入的信息。在许多站点中,从测试人员的角度来看,ORM 注入几乎与 SQL 注入相同。所以基本上我想知道的是 JPQL 和 SQL 注入之间的主要区别。

【问题讨论】:

    标签: security sql-injection jpql nosql-injection


    【解决方案1】:

    JPQL 注入和 SQL 注入都是 Code Injection 更广泛类别的示例。

    任何在运行时解析的语言都容易受到代码注入的影响。

    JPQL 或Java Persistence Query Language 在语法上与 SQL 相似,事实上它是写成字符串并在运行时解析。

    通过将 JPQL 查询字符串直接传递给 createQuery 方法来构建查询,如上所示,在 JPA 中称为动态查询构建,因为查询字符串可以在运行时动态构建。

    当描述说“在运行时动态构建”时,它们的意思是您的代码将 JPQL 查询格式化为 Java 字符串,然后提交要解析和执行的字符串。因此,您的代码有机会将固定字符串与可变内容结合起来。

    这是一个安全地使用参数将变量与 JPQL 语句组合的示例。这来自https://www.objectdb.com/java/jpa/query/parameter

    安全:

    TypedQuery<Country> query = em.createQuery(
        "SELECT c FROM Country c WHERE c.name = :name", Country.class);
    return query.setParameter("name", name).getSingleResult();
    

    这是以不安全的方式编写的相同查询,将变量直接组合到字符串中。

    不安全:

    TypedQuery<Country> query = em.createQuery(
        "SELECT c FROM Country c WHERE c.name = '" + name + "'", Country.class);
    

    如果可以避免的话,不要使用字符串连接来形成 JPQL 查询。这就是不安全内容潜入您的 JPQL 的方式。

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2013-03-17
      • 2015-07-15
      • 1970-01-01
      相关资源
      最近更新 更多