我有一个使用EntityManager.createNativeQuery的应用程序。我们的质量门(声纳)对此并不高兴,并且由于SQL注入的风险而向我显示严重错误。有没有安全的"在java中创建动态sql-query的方法?
我目前的代码如下:
return entityManager.createNativeQuery(stringBuilder.toString(), MyClass.class).getResultList();
答案 0 :(得分:1)
首先,即使您清理查询字符串的输入,Sonar也会抱怨。您可能必须// NOSONAR那一行。
Sonar无法判断您是否已扫描查询字符串的所有外部提供的输入。例如,“Joe'Bloggs”的名称输入将破坏您的查询字符串。我看不出你是如何构建查询的;您可以通过验证任何外部提供的值来确保其安全。
答案 1 :(得分:1)
为防止SQL注入,您可以使用参数绑定。
示例:
Query query = entityManager.createNativeQuery(
"SELECT title, author FROM books WHERE genre = ?1");
query.setParameter(1, "mystery");
您可以找到更多示例here。