Directrices de seguridad de System.Xml
En las siguientes secciones se proporcionan directrices generales que se pueden utilizar para proteger las aplicaciones System.Xml.
Nota |
---|
Los componentes System.Xml se basan en el sistema de seguridad de .NET Framework.En este tema solo se tratan los problemas de seguridad de los que se encargan específicamente las clases XML.Para obtener más información, vea Seguridad en .NET Framework. |
Problemas de seguridad
Los problemas de seguridad se pueden clasificar en tres categorías generales.
Acceso externo
Hay varias tecnologías XML que tienen la capacidad de recuperar otros documentos durante el procesamiento.Por ejemplo, una definición de tipo de documento (DTD) puede residir en el documento que se está analizando.La DTD también puede encontrarse en un documento externo al que hace referencia el documento que se está analizando.El lenguaje de definición de esquemas XML (XSD) y las tecnologías XSLT también tienen la capacidad de incluir información de otros archivos.Estos recursos externos pueden presentar algunos problemas de seguridad:
¿Cómo se garantiza que la aplicación solo recupere archivos de sitios de confianza? Por ejemplo, si un documento XML tiene una referencia a un archivo de Internet, ¿desea que la aplicación recupere este archivo?
Si recupera un archivo, ¿cómo garantiza que ese archivo no contiene datos malintencionados?
Denegación de servicio
Dado que los documentos XML pueden incluir referencias a otros archivos, resulta complicado determinar cuánta potencia de procesamiento será necesaria para analizar un documento XML.Por ejemplo, los documentos XML pueden incluir una DTD.Si la DTD contiene entidades anidadas o modelos de contenido complejos, podría ser necesario un tiempo de procesamiento elevado para analizar el documento.
Las siguientes acciones se consideran menos vulnerables a ataques de denegación de servicio, porque las clases System.Xml incluyen un medio de protección frente a dichos ataques.Para conocer los tipos de problemas de seguridad que pueden surgir al trabajar con componentes System.Xml y qué se puede hacer para mitigar estas amenazas, consulte Consideraciones de seguridad de System.Xml.
Análisis de datos XML de texto.
Análisis de datos XML binarios si dichos datos los ha generado Microsoft SQL Server 2005.
Escritura de fragmentos y documentos XML desde orígenes de datos al sistema de archivos, secuencias, TextWriter o StringBuilder.
Carga de documentos en el objeto del Modelo de objetos de documento (DOM) si se utiliza un objeto XmlReader y DtdProcessing establecido en Prohibit.
Navegación por el objeto DOM.
No es recomendable realizar las siguientes acciones si le preocupan los ataques de denegación de servicio o si trabaja en un entorno que no es de confianza.
Procesamiento de DTD.
Procesamiento de esquemas.Esto incluye agregar un esquema que no es de confianza a la colección de esquemas, compilar un esquema que no es de confianza y realizar la validación utilizando un esquema que no es de confianza.
Procesamiento de XSLT.
Análisis de cualquier flujo arbitrario de datos XML binarios proporcionados por el usuario.
Operaciones DOM como, por ejemplo, consultas, ediciones, movimiento de subárboles entre documentos y guardado de objetos DOM.
Si utiliza XmlReader, puede limitar el tamaño del documento a analizar estableciendo la propiedad MaxCharactersInDocument.Puede limitar el número de caracteres que resultan de expandir las entidades estableciendo la propiedad MaxCharactersFromEntities.Para ver ejemplos de cómo establecer estas propiedades, vea los temas de referencia correspondientes.
Procesamiento
Las tecnologías XSD y XSLT tienen capacidades adicionales que pueden afectar al rendimiento del procesamiento.Por ejemplo, es posible construir un esquema XML cuyo procesamiento requiere una cantidad sustancial de tiempo cuando se evalúa en un documento relativamente pequeño.También es posible incrustar bloques de scripts en una hoja de estilos XSLT.Ambos casos suponen una amenaza potencial para la seguridad de su aplicación.
Formas de mitigar los problemas de seguridad
En las secciones siguientes se detallan las formas de mitigar los problemas descritos en la sección "Problemas de seguridad" anterior.
Recursos externos
La clase XmlUrlResolver es la resolución predeterminada de todas las clases del espacio de nombres System.Xml.Se utiliza para cargar documentos XML y para resolver recursos externos como, por ejemplo, entidades, DTD o esquemas, e importar o incluir directivas.
Las API le permiten invalidarlo especificando el objeto XmlResolver que se va a utilizar.Utilice la clase XmlSecureResolver si necesita abrir un recurso que no controla o que no es de confianza.XmlSecureResolver contiene un XmlResolver y le permite restringir los recursos a los que tiene acceso el XmlResolver subyacente.
Procesamiento de la DTD
No habilite el procesamiento de DTD si le preocupan los problemas de denegación de servicio o si trabaja con orígenes que no son de confianza.El procesamiento de DTD está deshabilitado de manera predeterminada en los objetos XmlReader creados por el método Create.
Nota |
---|
XmlTextReader permite el procesamiento de DTD de manera predeterminada.Utilice la propiedad XmlTextReader.DtdProcessing para deshabilitar esta característica. |
Si tiene habilitado el procesamiento de DTD, puede utilizar XmlSecureResolver para restringir los recursos a los que tiene acceso XmlReader.También puede diseñar su aplicación para que el procesamiento XML se realice con restricciones de memoria y tiempo.Por ejemplo, puede configurar límites de tiempo de espera en la aplicación ASP.NET.
Procesamiento de XSLT
Si crea una aplicación que utiliza la clase XslCompiledTransform, debería conocer los siguientes puntos y sus implicaciones:
El script XSLT está deshabilitado de manera predeterminada.El script XSLT solo se debería habilitar si necesita compatibilidad con scripts o si está trabajando en un entorno de total confianza.
La función document() XSLT está deshabilitada de manera predeterminada.Si habilita la función document(), restrinja los recursos a los que se tiene acceso pasando un objeto XmlSecureResolver al método Transform.
Los objetos de extensión están habilitados de manera predeterminada.Si se pasa un objeto XsltArgumentList que contiene objetos de extensión al método Transform, los objetos de extensión se utilizan.
Las hojas de estilos XLST pueden incluir referencias a otros archivos y bloques de scripts incrustados.Un usuario malintencionado puede aprovecharse de esta característica para proporcionarle datos u hojas de estilos que, cuando se ejecutan, pueden hacer que el sistema los procese hasta que el equipo se quede sin recursos.
Las aplicaciones XSLT que se ejecutan en un entorno de confianza mixto pueden sufrir suplantaciones de hoja de estilos.Por ejemplo, un usuario malintencionado podría cargar un objeto con una hoja de estilos perjudicial y pasárselo a otro usuario que, a continuación, llama al método Transform y ejecuta la transformación.
Estos problemas de seguridad se pueden mitigar si no se habilitan los scripts o la función document() a menos que la hoja de estilos provenga de un origen de confianza, y si no se aceptan objetos XslCompiledTransform, hojas de estilos XSLT o datos de origen XML de un origen que no es de confianza.
Control de excepciones
Las excepciones que inician los componentes de nivel inferior pueden revelar información de la ruta que no desea que se muestre a la aplicación.Las aplicaciones deben detectar las excepciones y procesarlas de la manera correspondiente.
Uso de XmlTextWriter
Cuando se pasa el objeto XmlTextWriter a otra aplicación, el flujo subyacente queda expuesto a esa aplicación.Si necesita pasar el objeto XmlTextWriter a una aplicación de confianza parcial, debería utilizar en su lugar un objeto XmlWriter creado por el método Create.
Vea también
Tareas
Cómo: Utilizar la clase XmlSecureResolver