繁体   English   中英

通过Hibernate-Criteria和Session.save(对象)进行SQL注入

[英]SQL Injection through Hibernate-Criteria & Session.save(object)

为了避免sql注入,通常可以在HQL中使用位置参数命名参数 ,因为它在这里进行演示而stackoverflow也有样本。 我想知道在使用Criteria时可以采取哪些步骤。请提供示例代码或有用链接的任何帮助。

编辑
当我们保存一个对象时呢? 比方说,该对象可能有一个String变量,有些人可以为它分配一个易受攻击的SQL查询。

 myObject.setName(somevulnerablesql); session.save(myObject); 

在这种情况下,我们是否必须在分配给对象之前单独检查用户输入? 或任何其他步骤,以避免此类SQL注入?

我非常确定Criteria-Object将创建安全的HSQL。

你必须小心Expression对象。 您可以在那里创建SQL注入。 但是看一下生成的SQL: Hibernate show real SQL

编辑:除非Hibernate中存在巨大的错误,否则您无需确保在保存之前对String进行转义。 Hibernate使用预处理语句。 所以没有字符串连接,也没有Hibernate会话的SQL注入。

在使用Hibernate读取输出后,您可能必须转义输出。 例如:您有一个实体用户

class User{
    String name;
}

并且您调用用户“'或1 = 1; DROP DATABASE用户; - ”该字符串将存储在数据库中。 如果您使用Criterion对象查询用户,您将找到他(删除数据库)。 如果使用Expression对象查询User,则可以删除数据库(如果您隐藏了Strings)。

如果将用户的名称输出为HTML,则必须转义输出。 否则,名为"/><script>evilJavascript()</script>将对您的应用程序不利。

编辑2:看看这里: https//www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

Criteria不允许你自己编写易受攻击的SQL / HQL,因此SQL注入应该没有任何问题(除非Hibernate本身存在错误)。

编辑

正如@ckuetbach所指出的,Criteria实际上允许您使用Expression.sql(String sql)Restrictions.sqlRestriction(String)编写SQL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM