JPQL注入和SQL注入之间有什么区别

时间:2019-02-09 16:07:40

标签: security sql-injection jpql nosql-injection

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

1 个答案:

答案 0 :(得分:2)

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