How to prevent XPath/XML injection in .NET

2020-01-28 09:49发布

How can I prevent XPATH injection in the .NET Framework?

We were previously using string concatenation to build XPATH statements, but found that end users could execute some arbitrary XPATH. For example:

string queryValue = "pages[@url='" + USER_INPUT_VALUE + "']";
node = doc.DocumentElement.SelectSingleNode(queryValue);

Would it be sufficient to strip out single and double quotes from input strings?

Or, does the .NET framework support parameterized XPATH queries?

4条回答
家丑人穷心不美
2楼-- · 2020-01-28 09:59

Instead of strongly typed parameters you could decrease the options for a user. Why give them full control if you do not want that?

Provide the user with a couple of option to select from and then create the query.

Allowing the user to enter any string is asking for trouble or a lot of work.

查看更多
在下西门庆
3楼-- · 2020-01-28 10:07

Parameterized XPath is possible if you use Saxon as your XPath processor.

查看更多
家丑人穷心不美
4楼-- · 2020-01-28 10:17

The main idea in preventing an XPath injection is to pre-compile the XPath expression you want to use and to allow variables (parameters) in it, which during the evaluation process will be substituted by user-entered values.

In .NET:

  1. Have your XPath expresion pre-compiled with XPathExpression.Compile().

  2. Use the XPathExpression.SetContext() Method to specify as context an XsltContext object that resolves some specific variables to the user-entered values.

You can read more about how to evaluate an XPath expression that contains variables here.

This text contains good and complete examples.

查看更多
贪生不怕死
5楼-- · 2020-01-28 10:20

Strongly typed parameters are available if you use a full-blown XsltTransform.

查看更多
登录 后发表回答