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

时间:2012-07-24 07:38:41

标签: sql sql-injection hsqldb jpql

例如。我有:

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();

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

CriteriaBuilder cb = em.getCriteriaBuilder();

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

一个人有什么优势吗?

2 个答案:

答案 0 :(得分:2)

不,它不会。这是参数化查询的重点。

答案 1 :(得分:0)

使用预准备语句进行SQL注入是不可能的。

但是如果用户输入参数的值,则只能输入一个字母并删除a.name列中任何位置包含该字母的所有记录,可能会误用表达式Class<T>