1

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

4

1 回答 1

2

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

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

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 的方式。

于 2019-02-10T17:23:07.857 回答