使用StringBuilder和JPA本机查询时有哪些风险?

时间:2018-02-05 16:18:47

标签: java jpa eclipselink

我需要创建一个本机sql查询,我打算使用StringBuilder来创建它。

StringBuilder sqlQuery = new StringBuilder();
    sqlQuery.append("SELECT ");
    sqlQuery.append("b.\"id\", ");
    sqlQuery.append("b.\"title\", ");
    sqlQuery.append("a.\"author_name\" as author ");
    sqlQuery.append("FROM ");
    sqlQuery.append(":dbName b ");
    sqlQuery.append("JOIN ");
    sqlQuery.append(":dbName2 a");
    sqlQuery.append(" ON a.\"id\" = b.\"author\"");

    ObjectQuery query = objectManager.createQuery(sqlQuery.toString());
    query.setParameter("dbName", "Book");
    query.setParameter("dbName2", "Author");

使用StringBuilder的附加是否安全?这不会导致攻击者的SQL注入吗?攻击者能否附加将丢弃整个数据库的部分查询?有什么建议吗?

我知道这个查询很简单,并且可以用单个字符串编写,但我有更大的查询if语句和循环根据参数追加更多行

我知道命名查询更安全但在我的情况下,直到最后一刻我都不知道查询会是什么样。

2 个答案:

答案 0 :(得分:3)

如果您使用示例代码中的Query.setParameter()设置参数值:

query.setParameter("dbName", "Book");
query.setParameter("dbName2", "Author");

你不应该有SQL注入问题。

当您在创建的查询中自己连接用户数据时,就会发生SQL注入 但是你不是这种情况,因为StringBuilder对象创建的查询完全由你掌握,并且不从外部客户端获取任何值。

  

使用StringBuilder的附加物是否安全?

虽然StringBuilder变量(当心:StringBuilder不是线程安全的)是在方法范围内创建和操作的,但它并不比其他解决方案更安全或更不安全。

它与安全没有任何关系,但正如@HRgiger建议的那样,一个好的选择是使用Criteria API。
当您解释查询的构造非常动态时,这是有道理的:

  

我有更大的查询,if语句决定了什么   附加

它将产生更易于维护和可读的代码。

答案 1 :(得分:1)

在这种情况下,仅仅因为使用setParameter而没有获得SQL注入攻击的风险,但您必须注意StringBuilder不是线程安全类型。