Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 如何通过POJO防止Hibernate中的SQL注入_Java_Sql Server_Spring_Hibernate_Tomcat - Fatal编程技术网

Java 如何通过POJO防止Hibernate中的SQL注入

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=

我们正在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=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()
方法设置数据(或者对于JDBC
prparedstatements
使用
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执行!你是怎么得出这个结论的?