如何防止XPath注入在.NET Framework?
我们以前使用字符串连接来构建XPATH语句,却发现最终用户可以执行任意的XPATH。 例如:
string queryValue = "pages[@url='" + USER_INPUT_VALUE + "']";
node = doc.DocumentElement.SelectSingleNode(queryValue);
难道是足以从输入字符串去掉单引号和双引号?
或者,做了.NET框架的支持参数的XPath查询?
如何防止XPath注入在.NET Framework?
我们以前使用字符串连接来构建XPATH语句,却发现最终用户可以执行任意的XPATH。 例如:
string queryValue = "pages[@url='" + USER_INPUT_VALUE + "']";
node = doc.DocumentElement.SelectSingleNode(queryValue);
难道是足以从输入字符串去掉单引号和双引号?
或者,做了.NET框架的支持参数的XPath查询?
在防止XPath注入的主要思想是预编译要使用,并允许变量(参数)在它,这在评价过程中将由用户输入的值被取代的XPath表达式 。
在.NET中 :
有你的XPath expresion预编译XPathExpression.Compile() 。
使用XPathExpression.SetContext()方法来指定一个作为背景XsltContext解析为用户输入的值某些特定变量的对象。
你可以阅读更多有关如何评估包含变量XPath表达式这里 。
本文所包含的良好而完整的例子。
如果你使用一个完全成熟的强类型的参数可用XsltTransform 。
如果你使用撒克逊作为你的XPath处理器参数XPath是可能的。
相反,强类型的参数,你可以减少对用户的选项。 为什么给他们完全的控制,如果你不希望出现这种情况?
提供了几个选项的用户,从选择,然后创建查询。
允许用户输入任意字符串是自找麻烦还是有很多的工作。