【问题标题】:Prevent Sql injection in nhibernate在 nhibernate 中防止 Sql 注入
【发布时间】:2014-01-06 11:33:44
【问题描述】:

在我的项目中,我有一种方法将 serviceTags 作为 nhibernate 动态查询中的字符串参数输入,并将其替换为 ''。现在它已经参数化,但仍然对 sql 注入构成威胁。所以我的问题是在没有威胁的情况下获得这种功能我该怎么办?用户输入的类型/长度检查已经在我的脑海中,我认为这不会解决整个威胁。

 public Dictionary<string, string> GetCollectionStatus(string serviceTags)
 { using (var session = m_SessionFactory.OpenSession())
        {
           foreach (var resultParts in session.CreateSQLQuery(string.Format("select servicetag , " +
                                                                             "DiagnosticStatus from AssetOverview where servicetag IN ('{0}')", 
                                                                             serviceTags.Replace(",", "','"))).List())
            {
                collectionStatus.Add(((object[])(resultParts))[0].ToString(), ((object[])(resultParts))[1].ToString());
            }
        }
        return collectionStatus;
    }

【问题讨论】:

  • +1 即使在使用 ORM 时也考虑 SQL 注入

标签: c# sql nhibernate


【解决方案1】:

为了防止 SQL 注入,即使用 NHibernate 来格式化你的字符串,只需这样做:-

var q = session.CreateSQLQuery(
   "select servicetag, DiagnosticStatus from AssetOverview 
       where servicetag IN (:list)")
   .SetParameterList("list", serviceTags)
   .List();

NHibernate 将为您转义单引号。

编辑我会执行以下操作,因为我可以看到 serviceTags 是一个逗号分隔的列表...

   .SetParameterList("list", serviceTags.split(','))

请注意,如果您有前导/尾随空格或空格,这可能会产生问题!

【讨论】:

  • @Rippo 但 serviceTags.Replace(",", "','")) 是必需的,请您修改一下吗?
  • 更新以反映服务标签是逗号分隔的输入而不是List&lt;string&gt;
  • @Rippo 谢谢。更改我的代码后,我会稍后恢复。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2018-03-23
相关资源
最近更新 更多