【发布时间】:2018-02-05 16:18:47
【问题描述】:
我需要创建一个原生 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的append安全吗?这不会导致来自攻击者的 SQL 注入吗?攻击者是否能够附加将删除整个数据库的查询的一部分?有什么建议吗?
我知道这个查询很简单,可以用单个字符串编写,但我有更大的查询,如果语句和循环根据参数附加更多行
我知道命名查询更安全,但就我而言,直到最后一刻我才知道查询会是什么样子。
【问题讨论】:
-
您在这里使用 StringBuilder 的原因是什么?您的查询可以写入一个字符串文字,无需串联。
-
@Tom 我对决定附加什么的 if 语句有更大的查询。为了便于阅读,我放了一个简短的
-
AFAIK,不管你使用 String 还是 StringBuilder,如果你不使用preparedstatement,那么它很容易受到攻击。
-
如果您在没有验证的情况下附加用户输入,或者您没有仔细转义用户输入,是的,可能存在这种可能性
-
您可能需要查看 CriteriaAPI。
标签: java jpa eclipselink