Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 命名参数未绑定_Java_Sql_Hibernate_Hql_Createquery - Fatal编程技术网

Java 命名参数未绑定

Java 命名参数未绑定,java,sql,hibernate,hql,createquery,Java,Sql,Hibernate,Hql,Createquery,我有多个HQL语句,易受SQL注入示例的攻击: 公共列表搜索列表(字符串用户名、字符串名、字符串名、字符串电子邮件)异常{ List personList=新建ArrayList(); String hql=“FROM**.**.**.entity.Person P WHERE”; 布尔buName=false; 布尔bfName=false; if(StringUtils.isNotEmpty(用户名)){ hql=hql+“较低的(P.userName)如:userName”; buName

我有多个HQL语句,易受SQL注入示例的攻击:

公共列表搜索列表(字符串用户名、字符串名、字符串名、字符串电子邮件)异常{
List personList=新建ArrayList();
String hql=“FROM**.**.**.entity.Person P WHERE”;
布尔buName=false;
布尔bfName=false;
if(StringUtils.isNotEmpty(用户名)){
hql=hql+“较低的(P.userName)如:userName”;
buName=true;
}
if(StringUtils.isNotEmpty(firstName)&&StringUtils.isNotEmpty(lastName)){
if(buName){
hql=hql+“或”;
}
hql=hql+“(较低的(P.firstName)类似于:firstName,较低的(P.lastName)类似于:lastName)”;
bfName=true;
}
if(StringUtils.isNotEmpty(internetAddr)){
if(buName | | bfName){
hql=hql+“或”;
}
hql=hql+“较低(P.email)=:email”;
}
试一试{
Query Query=getCurrentSession().createQuery(hql);
if(StringUtils.isNotEmpty(用户名)){
setParameter(“userName”、“%”用户名+userName.toLowerCase()+“%”);
}else if(StringUtils.isNotEmpty(firstName)和&StringUtils.isNotEmpty(lastName)){
setParameter(“firstName”、“%”+firstName.toLowerCase()+“%”);
setParameter(“lastName”、“%”+lastName.toLowerCase()+“%”);
}else if(StringUtils.isNotEmpty(电子邮件)){
query.setParameter(“email”,email.toLowerCase());
}
personList=query.list();
}捕获(例外e){
抛出新异常(如getMessage());
}
回归人格;
}
在这里,我避免在查询
“%”+userName+“%”“
中串联以避免SQL注入漏洞,现在我看到了与此相关的异常

Named parameters not bound: lastname

这是基于使用
firstname
进行搜索而发生的。如何避免这种情况?

您应该纠正以下问题:

if(StringUtils.isNotEmpty(用户名)){
setParameter(“userName”、“%”用户名+userName.toLowerCase()+“%”);
}else if(StringUtils.isNotEmpty(firstName)和&StringUtils.isNotEmpty(lastName)){
setParameter(“firstName”、“%”+firstName.toLowerCase()+“%”);
setParameter(“lastName”、“%”+lastName.toLowerCase()+“%”);
}else if(StringUtils.isNotEmpty(电子邮件)){
query.setParameter(“email”,email.toLowerCase());
}   
为此:

if(StringUtils.isNotEmpty(用户名)){
setParameter(“userName”、“%”用户名+userName.toLowerCase()+“%”);
}
if(StringUtils.isNotEmpty(firstName)和&StringUtils.isNotEmpty(lastName)){
setParameter(“firstName”、“%”+firstName.toLowerCase()+“%”);
setParameter(“lastName”、“%”+lastName.toLowerCase()+“%”);
}
if(StringUtils.isNotEmpty(电子邮件)){
query.setParameter(“email”,email.toLowerCase());
}   
因为您应该向HQL添加命名参数,并通过
query.setParameter
一致地设置它们

注意

我正在避免查询“'%”+用户名+“%”中的串联,以避免SQL注入漏洞

您可以在HQL中使用,如下所示:

... 
lower(P.userName) like '%' || :userName || '%'
...

它还允许您避免SQL注入。但是请注意,这种类似于的
很可能会导致.

在JDBC中使用和设置参数不会受到SQL注入攻击。当有人可以将内容注入实际SQL语句本身时,就会发生SQL注入攻击。