我需要创建一个本机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语句和循环根据参数追加更多行
我知道命名查询更安全但在我的情况下,直到最后一刻我都不知道查询会是什么样。
答案 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不是线程安全类型。