【问题标题】:How to prevent SQL Injection in Hibernate via POJO如何通过 POJO 防止 Hibernate 中的 SQL 注入
【发布时间】:2017-03-14 15:26:42
【问题描述】:

我们在 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 平台各个部分的各种休息服务。我们发现的问题是用户可以将一个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

以上只是我们所看到的一般示例。

我已经查看了所有内容,到目前为止,我发现的只是清理查询数据而不是通过休眠插入值的示例。有没有办法通过休眠让它在将 pojo 的数据插入数据库之前对其进行清理?

【问题讨论】:

  • hibernate 实际上并没有执行那个 SQL,不是吗?
  • 我想补充一点:除非有一些奇怪的映射选项(我从未听说过),否则应该不可能让 Hibernate 执行字段的内容为SQL!你是怎么得出这个结论的?

标签: java sql-server spring hibernate tomcat


【解决方案1】:

简单回答:

您需要确保您没有将HQL/SQL 查询字符串与输入数据直接连接,如下所示:

//Unsafe Hibernate query, Never do this
Query query = session.createQuery(" from Employee where empId='"+inputEmpId+"'");

相反,您需要使用org.hibernate Query API 提供的setParameter() 方法设置数据(或者对于JDBC PraparedStatements 使用setString("") 等),如下所示:

//Safe Hibernate query
Query query = session.createQuery(" from Employee where empId=:empId");
query.setParameter("empId", inputEmpId);

长答案可以看here

【讨论】:

    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2015-09-27
    • 2012-12-15
    • 2015-09-07
    • 2011-09-10
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多