参数化的 java 持久性查询是不是容易受到 sql 注入的影响?

Posted

技术标签:

【中文标题】参数化的 java 持久性查询是不是容易受到 sql 注入的影响?【英文标题】:Is a parameterized java persistence query susceptible to sql injections?参数化的 java 持久性查询是否容易受到 sql 注入的影响? 【发布时间】:2012-07-24 07:38:41 【问题描述】:

例如。我有:

Input:
ArrayList<Integer> idlist
String nameText

    String q = "DELETE FROM myTable AS a WHERE a.name LIKE '%' || :name || '%' OR a.id IN (:idlist)";

    Query query = entityManager.createQuery(q);
    query.setParameter("name", nameText);
    query.setParameter("idlist", idlist);

query.executeUpdate();

上面的 sn-p 代码是否容易受到 sql 注入的影响? 我还有一个问题是上述查询的构建方式与我们是否按标准形成查询之间存在差异:

CriteriaBuilder cb = em.getCriteriaBuilder();

  CriteriaQuery<Country> q = cb.createQuery(Country.class);
  Root<Country> c = q.from(Country.class);
  q.select(c);

一个比另一个有什么优势吗?

【问题讨论】:

【参考方案1】:

不,不会。这就是参数化查询的全部意义所在。

【讨论】:

我还有一个问题是上述查询的构建方式与我们是否按标准形成查询之间存在差异......我的意思是 createSelect,类似的东西? 没有。 Criteria API 还使用 JDBC 准备语句。【参考方案2】:

没有准备好的语句进行 SQL 注入的机会。

但如果参数的值是由用户输入的,则表达式LIKE % || :name || %可能会被误用,方法是只输入一个字母并删除a.name列中任何位置包含该字母的所有记录

【讨论】:

以上是关于参数化的 java 持久性查询是不是容易受到 sql 注入的影响?的主要内容,如果未能解决你的问题,请参考以下文章

这个参数化查询是不是对 SQL 注入开放?

MyBatis初学者总结-搭建MyBatis环境步骤

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

log4javascript 是不是容易受到 Apache Log4j(Java 日志库)远程代码执行 CVE-2021-44228 的攻击?

检测 SQL 注入

Kerberos RC4-HMAC 是不是容易受到成年礼攻击?