Java 如何通过POJO防止Hibernate中的SQL注入
我们正在Tomcat上使用Hibernate。我们最近在Hibernate代码中发现了一个SQL注入漏洞。特别是在我们用于ORM的POJO规范中 我们正在接受用户输入并创建一个新的POJO,如下所示:Java 如何通过POJO防止Hibernate中的SQL注入,java,sql-server,spring,hibernate,tomcat,Java,Sql Server,Spring,Hibernate,Tomcat,我们正在Tomcat上使用Hibernate。我们最近在Hibernate代码中发现了一个SQL注入漏洞。特别是在我们用于ORM的POJO规范中 我们正在接受用户输入并创建一个新的POJO,如下所示: //POJO associated with Foo.hib.xml public class Foo{ private String a; private String b; public Foo(String a, String b){ this.a=
//POJO associated with Foo.hib.xml
public class Foo{
private String a;
private String b;
public Foo(String a, String b){
this.a=a;
this.b=b;
}
//Getters go here
}
我们有许多这样的POJO,它们用于tomcat平台各个部分的各种rest服务中。我们发现的问题是,用户可以将sql查询设置为Foo的值,因此当我们创建并保存它时,他们可以执行sql注入:
//example of possible injection
Foo foo = new Foo("select * from *;", "insert * into * as *");
//save new Foo to hibernate
session.saveOrUpdate(foo); //above queries will be executed on insert
以上只是我们所看到的一个普通例子
我已经浏览了所有地方,到目前为止,我所发现的只是一些示例,用于清理查询中的数据,而不是通过hibernate插入值。有没有办法通过hibernate让它在将pojo数据插入数据库之前对其进行清理?简单回答: 您需要确保您没有将
HQL/SQL
查询字符串与输入数据直接连接起来,如下所示:
//Unsafe Hibernate query, Never do this
Query query = session.createQuery(" from Employee where empId='"+inputEmpId+"'");
//Safe Hibernate query
Query query = session.createQuery(" from Employee where empId=:empId");
query.setParameter("empId", inputEmpId);
相反,您需要使用org.hibernate Query
API提供的setParameter()
方法设置数据(或者对于JDBCprparedstatements
使用setString(“”
)等),如下所示:
//Unsafe Hibernate query, Never do this
Query query = session.createQuery(" from Employee where empId='"+inputEmpId+"'");
//Safe Hibernate query
Query query = session.createQuery(" from Employee where empId=:empId");
query.setParameter("empId", inputEmpId);
对于长答案,您可以看看。hibernate实际上并没有执行SQL,是吗?我想附议一下:除非有一些奇怪的映射选项(我从未听说过),否则hibernate不可能将字段的内容作为SQL执行!你是怎么得出这个结论的?