在我的项目中,我有一个方法,它将serviceTags作为nhibernate动态查询中的字符串参数输入,并用''替换它.现在它已经参数化但仍然是对sql注入的威胁.所以我的问题是在没有威胁的情况下获得这种功能我该怎么办?用户输入的类型/长度检查已经在我的脑海中,我认为这不会解决整个威胁.
public DictionaryGetCollectionStatus(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; }
Rippo.. 8
为了防止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(','))
请注意,如果你有前导/尾随空格或空格,这可能会给你带来麻烦!
为了防止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(','))
请注意,如果你有前导/尾随空格或空格,这可能会给你带来麻烦!