我有一个查询
类似的内容。
StringBuilder sbQry = new StringBuilder();
sbQry.append("select * from tableName where 1=1");
if(!myCollection.isEmpty()){
sbQry.append(" and (");
for (int i = 0; i < myCollection.size(); i++) {
final String module = myCollection.get(i);
sbQry.append("column = '" + module
+ "' or column like 'J_'||'"
+ module.replaceAll("-", "%") + "'");
if (!(i == (myCollection.size() - 1))) {
sbQry.append(" or ");
}
}
sbQry.append(") ");
}
这里,此查询sbqry
易受sqlinjection
攻击,因为mycollection
来自外部源。
如果我的集合元素将基于=
运算符进行比较,那么我将使用prepared语句,如下所示:
sbQry.append(column in (:collection));
Query query = session.createSQLQuery(sbQry.toString());
query.setParameterList("collection",myCollection);
任何帮助都将不胜感激。
为了防止SQL注入,您应该使用绑定参数,而不是字符串插值。
StringBuilder sbQry = new StringBuilder();
List<String> params = new ArrayList<>();
sbQry.append("select * from tableName");
if(!myCollection.isEmpty()){
sbQry.append(" where ");
int size = myCollection.size;
List<String> terms = new ArrayList<>();
for (int i = 0; i < size; i++) {
final String module = myCollection.get(i);
terms.add("column = ? or column like ?");
params.add(module);
params.add("J_" + module.replaceAll("-", "%"));
}
sbQry.append(String.join(" or ", terms));
}
Query q = sess.createQuery(sbQry);
int size = params.size();
for (int i = 0; i < size; i++) {
q.setString(i, params[i]);
}
我没有测试过上面的代码,但它应该会给你大致的思路。
使用绑定参数而不是字符串级联是防止SQL注入的一种安全方法,而且它还使代码更易于编写和读取。
问题内容: 我有一个现有的代码,其中应用程序根据很多条件生成不同的sql并通过hibernate会话createSQLQuery()执行它们。在这里,这些参数与作为普通字符串替换驻留在java类中的sql字符串相连接。现在的问题是,我需要防止sql注入。因此,为此,我必须使用getNamedQuery()并绑定参数,以便hibernate将处理特殊字符。但是问题在于将字符串sql的字符串移动到xm
问题内容: 通配符*只能在单词的末尾使用,例如。 我想用like查询,该怎么做? 问题答案: Lucene提供了ReverseStringFilter,它允许执行通配符搜索,例如* user。它通过以相反顺序索引所有术语来工作。 但是我认为没有办法做类似’LIKE%user%’的事情。
问题内容: 我想用Hibernate实现一些通用过滤器。它应该像来自SQL的运算符一样工作: 我在哪里 key 是列名, value 是它的值。 我尝试过这样的事情: 但是,当字段类型不是 String时 ,它将导致 : 有办法解决吗? 问题答案: 在这种情况下,我建议使用而不是。 我不记得Criteria是否像Query对象一样将无法理解的事情传递给数据库。基本上,这意味着如果您使用的功能是Hi
在 Transact-SQL 中,LIKE 运算符用于搜索带有 WHERE 子句的列中指定的模式。Transact-SQL 中的 LIKE 子句用于比较相同的值以使用通配符运算符。 两个通配符与 LIKE 运算符结合使用: - 百分号代表零、一个或一些字符。 - 下划线符号代表单个字符。 注意:MS Access 使用星号 () 代替百分号 () 和问号 (?) 而不是下划线 ()。 百分号代表
问题内容: 我正在使用hibernate模式开发应用程序。当我尝试创建登录页面时,出现Sql Injection问题。我有以下代码: 在这种情况下,如何防止Sql Injection?loginInfo表的创建表语法如下: 问题答案: 您还有其他选择,请参阅mkyong的这篇不错的文章。
问题内容: 设置以下映射 通知ID是一个整数。现在我需要使用like运算符进行此HQL查询 ATT:它 就像 运算符NOT = (等于运算符) 然后我用 但是不起作用,因为Hibernate抱怨在调用User.id的getter时发生了IllegalArgumentException 即使我使用 这没用 我应该使用什么来传递查询? 问题答案: 根据Hibernate参考: str()用于将数字或时