我已阅读有关 JPQL 注入和 SQL 注入的信息。在许多站点中,从测试人员的角度来看,ORM 注入几乎与 SQL 注入相同。所以基本上我想知道的是 JPQL 和 SQL 注入之间的主要区别。
问问题
518 次
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 回答