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的初学者,所以我想仔细检查一下。
谢谢!
答案 0 :(得分:9)
是的,使用NHibernate时几乎不受SQL注入的影响。它对支持这些的所有平台上的所有生成的SQL语句使用参数化查询。
但是,您可以通过使用自定义SQL进行插入/更新,或者使用某种类型的execute_sql
的变体执行SQL,或者使用不带参数的SQL查询来解决此问题。
答案 1 :(得分:3)
只要您不将用户输入直接插入HQL或SQL,您就是安全的:没有其他(hibernate提供的功能)将允许用户注入恶意代码。
答案 2 :(得分:2)
只是为了回应其他人,如果你让NHibernate生成你的SQL你是安全的,至少在理论上是这样。
但是,您仍需要小心数据库中的存储过程,触发器和函数,尤其是动态SQL。即使客户端在任何地方使用参数化查询,仍然可以进行注入。