【问题标题】:Prevention against SQL Injection in Hibernate在 Hibernate 中防止 SQL 注入
【发布时间】:2011-06-04 03:19:43
【问题描述】:

我使用hibernate与我的数据库进行交互,现在我想让我的数据库层对SQL注入安全,所以我做了一些研究,我发现我的查询应该是参数化的,这是否意味着我只是结构化我的 HQL 查询为:

List mothers = session.createQuery(
"select mother from Cat as cat join cat.mother as mother where cat.name = ?")
.setString(0, name)
.list();

然后它被参数化并保护免受 SQL 注入,或者还有其他我需要做的事情......

还提到了另一件事 - “总是逃避您的数据”如何实现??

【问题讨论】:

    标签: hibernate hql sql-injection parameterized


    【解决方案1】:

    我不知道setString(),但如果它与setParameter() 相同,那么是的,这样做足以防止sql注入。

    更新

    通过转义数据,意味着您必须确保您没有在数据库中存储危险值。

    一个简单的例子是,例如,如果你传入参数

    String name = "<script>alert('Hello');</script>";
    //insert this name into Mother, and then when you load it from the database, it will be displayed    
    
    List mothers = session.createQuery(
    "select mother from Cat as cat join cat.mother as mother where cat.name = ?")
    .setString(0, name)
    .list();
    

    到您的查询,然后下次从数据库中加载它,并在您的网络浏览器中呈现它,它将运行脚本。
    您需要确保您的框架转义所有非法字符,即:将&amp;lt; 更改为&amp;lt;,然后再将其插入数据库。
    如果您的框架不这样做,则必须手动进行。 有大量的库可以为您正确转义代码。例如,看看this question 和那里的答案。

    【讨论】:

    • 我查看了您提出的链接..人们建议解决 html 转义..是否需要任何其他类型的转义??
    • -1。转义输入数据不是预防 XSS 的好方法。更好的方法是在将不可信数据插入到如此危险的上下文(例如 HTML 页面)时转义它们,同时考虑到该上下文的规则。另见OWASP XSS Prevention Cheat Sheet。另外问题是关于 SQL 注入,而不是关于 XSS。
    • @axtavt 如果您阅读我在代码中的回答和评论,您会看到我提到数据必须在插入表 Mother 时进行转义。
    • @axtavt:Axtvt 并没有那么错:元数据表示发生变化时需要转义。 -- 我的意思是:从 Java 到 SQL 时(发送Sql 语句)你必须注意 SQL 转义,而不是 HTML 的东西。在编写 HTML 页面时,您必须注意 HTML 转义,而不是 SQL 内容。 -- 规则很简单:每次您的数据从一种上下文/风格转移到另一种时,您都必须注意转义
    猜你喜欢
    • 2015-09-27
    • 2017-03-14
    • 2013-02-10
    • 2012-12-15
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多