2011-06-17 39 views
6

¿Cómo puedo evitar la inyección de XPATH en .NET Framework?Cómo prevenir la inyección de XPath/XML en .NET

Anteriormente utilizábamos la concatenación de cadenas para crear sentencias XPATH, pero descubrimos que los usuarios finales podían ejecutar algunas XPATH arbitrarias. Por ejemplo:

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

¿Sería suficiente quitar comillas simples y dobles de las cadenas de entrada?

O, ¿el .NET framework admite consultas XPATH parametrizadas?

Respuesta

8

La idea principal en la prevención de una inyección XPath es comprobar la validez de compilar la expresión XPath que desea utilizar y permitir que las variables (parámetros) en ella, que durante el proceso de evaluación será sustituido por los valores introducidos por el usuario.

En .NET:

  1. Haga que su expresion XPath pre-compilado con XPathExpression.Compile().

  2. Uso del XPathExpression.SetContext() Método para especificar como contexto un objeto XsltContext que resuelve algunas variables específicas a los valores introducidos por el usuario.

Usted puede leer más acerca de cómo evaluar una expresión XPath que contiene variables here.

Este texto contiene buenos y completos ejemplos.

2

Los parámetros fuertemente tipados están disponibles si utiliza un XsltTransform completo.

+0

En mi caso, estoy tratando de buscar un nodo en un archivo XML. Entonces XSLT es excesivo. – frankadelic

+0

Los parámetros fuertemente tipados son posibles no solo usando una transformación XSLT: vea mi respuesta. –

0

En lugar de los parámetros fuertemente tipados, puede disminuir las opciones para un usuario. ¿Por qué darles el control total si no quieres eso?

Proporcione al usuario un par de opciones para seleccionar y luego crear la consulta.

Permitir que el usuario ingrese cualquier cadena implica problemas o mucho trabajo.

+0

Lo que está sugiriendo suena como información desinfectante. ¿Puede proporcionar el conjunto de caracteres que deben filtrarse para XPATH? – frankadelic

+0

@frankadelic: No necesita "un conjunto de caracteres" en absoluto. La forma de protegerse de una inyección XPath es usar una expresión XPath precompilada que contenga variables. Consulte mi respuesta para obtener una explicación y enlaces a la documentación relevante de .NET. –

+0

Sí, eso es lo que quise decir. No permita la entrada de cadenas. Da algunos botones de opción y casillas de verificación y codifica las consultas. –

1

XPath parametrizado es posible si utiliza Saxon como procesador XPath.

Cuestiones relacionadas