使用Plain-Vanilla NHibernate进行SQL注入

时间:2010-03-25 14:20:48

标签: nhibernate sql-injection

Plain-vanilla NHibernate设置,例如,没有流畅的NHibernate,没有HQL,除了域对象和NHibernate映射文件之外什么也没有。我通过以下方式加载对象:

_lightSabers = session.CreateCriteria(typeof(LightSaber)).List<LightSaber>();

我将原始用户输入直接应用于“LightSaber”类的一个属性:

myLightSaber.NameTag = "Raw malicious text from user";

然后我保存了LightSaber:

session.SaveOrUpdate(myLightSaber);

我见过的所有内容都表明是的,在这种情况下,你不受SQL注入的影响,因为NHibernate参数化并逃脱了引擎下的查询。但是,我也是NHibernate的初学者,所以我想仔细检查一下。

谢谢!

3 个答案:

答案 0 :(得分:9)

是的,使用NHibernate时几乎不受SQL注入的影响。它对支持这些的所有平台上的所有生成的SQL语句使用参数化查询。

但是,您可以通过使用自定义SQL进行插入/更新,或者使用某种类型的execute_sql的变体执行SQL,或者使用不带参数的SQL查询来解决此问题。

答案 1 :(得分:3)

只要您不将用户输入直接插入HQL或SQL,您就是安全的:没有其他(hibernate提供的功能)将允许用户注入恶意代码。

答案 2 :(得分:2)

只是为了回应其他人,如果你让NHibernate生成你的SQL你是安全的,至少在理论上是这样。

但是,您仍需要小心数据库中的存储过程,触发器和函数,尤其是动态SQL。即使客户端在任何地方使用参数化查询,仍然可以进行注入。