Compartir a través de


Consideraciones de seguridad de System.Xml

Actualización: November 2007

En las siguientes secciones se describen los tipos de problemas de seguridad que pueden surgir al trabajar con componentes System.Xml y qué se puede hacer para mitigar estas amenazas.

Nota:

Los componentes System.Xml se basan en el sistema de seguridad de Microsoft .NET Framework. En este tema sólo 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.

  • Clase XmlResolver

  • Las clases XmlReader y XmlReaderSettings

  • Clase XmlTextReader

  • Clase XslCompiledTransform

  • Document Object Model

Clase XmlResolver

La clase XmlResolver se utiliza para resolver recursos. Se utiliza para cargar documentos XML y para resolver recursos externos como, por ejemplo, entidades, DTD o esquemas, e importar o incluir directivas. .NET Framework incluye dos implementaciones de la clase XmlResolver.

La clase XmlUrlResolver es la resolución predeterminada de todas las clases del espacio de nombres System.Xml. Es compatible con los protocolos file:// y http:// y las solicitudes de la clase WebRequest. En muchos casos, si no se especifica un objeto XmlResolver que debería utilizar la aplicación, se utiliza un objeto XmlUrlResolver sin credenciales de usuario para tener acceso a los recursos XML.

La clase XmlSecureResolver ayuda a proteger otro objeto XmlResolver conteniendo el objeto XmlResolver y restringiendo los recursos a los que tiene acceso el XmlResolver subyacente. Por ejemplo, la clase XmlSecureResolver puede prohibir el acceso a determinados sitios o zonas de Internet.

Debería tener en cuenta los siguientes puntos cuando trabaje con la clase XmlResolver.

  • Los objetos XmlResolver pueden contener información confidencial como, por ejemplo, credenciales de usuario, que se pueden utilizar para obtener acceso y recuperar datos. Debe tener cuidado cuando almacene en caché objetos XmlResolver y no debería pasar el objeto XmlResolver a un componente que no sea de confianza, porque dicho componente podría utilizar XmlResolver y sus credenciales de usuario para obtener acceso a los datos.

  • Si está diseñando una propiedad de clase que utilice la clase XmlResolver, dicha propiedad se debería definir como de sólo escritura. La propiedad se puede utilizar para especificar el XmlResolver que se debe utilizar, pero no se puede utilizar para devolver un objeto XmlResolver. Esto permite que un componente que no sea de confianza utilice la clase, pero no permite recuperar y utilizar directamente el objeto XmlResolver.

  • Si la aplicación acepta objetos XmlResolver de código que no sea de confianza, no puede dar por hecho que el identificador URI que se pasa al método GetEntity es el mismo que devuelve el método ResolveUri. Las clases derivadas de la clase XmlResolver pueden invalidar el método GetEntity y devolver datos diferentes a lo que contenía el identificador URI original.

  • La aplicación puede mitigar las amenazas de denegación de servicio en el método GetEntity implementando una IStream implementada de contención que limite el número de bytes leídos. Esto ayuda a protegerse contra situaciones en las que algún código malintencionado intenta pasar una secuencia de bytes infinita al método GetEntity.

Las clases XmlReader y XmlReaderSettings

Virtualmente, todos los componentes System.Xml se crean basándose en el concepto del análisis XML. Por ejemplo, la clase XmlDocument utiliza la clase XmlReader para analizar un documento y crear una representación en memoria del documento XML.

Se recomienda utilizar el método Create para crear objetos XmlReader. La clase XmlReaderSettings especifica el conjunto de características que desea habilitar en el objeto XmlReader.

Limitar el tamaño de expansión de documentos y entidades

El uso de la memoria que hace una aplicación que utiliza el XmlReader puede tener una correlación con el tamaño del documento XML analizado. Una forma de provocar un ataque de denegación de servicio es enviando documentos XML excesivamente grandes para ser analizados.

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 de DTD

El procesamiento de DTD puede dar lugar a un problema de denegación de servicio. Por ejemplo, la DTD puede contener entidades anidadas o modelos de contenido complejos que pueden tardar en procesarse una cantidad de tiempo inusual.

El procesamiento de DTD está deshabilitado de manera predeterminada. Se inicia una XmlException cuando XmlReader encuentra datos DTD.

Procesamiento de esquemas.

Los marcadores de validación ProcessInlineSchema y ProcessSchemaLocation de un objeto XmlReaderSettings no están establecidos de manera predeterminada. Esto ayuda a proteger el XmlReader contra ataques basados en esquemas cuando está procesando datos XML de un origen que no es de confianza. Cuando se establecen estos marcadores, se utiliza el XmlResolver del objeto XmlReaderSettings para resolver las ubicaciones de esquemas que se encuentra en el documento de la instancia de XmlReader. Si se establece la propiedad XmlResolver en null, las ubicaciones de esquemas no se resuelven aunque se establezcan los marcadores de validación ProcessInlineSchema y ProcessSchemaLocation.

Los esquemas que agregan durante la validación agregan nuevos tipos y pueden cambiar el resultado de la validación del documento. Como consecuencia, los esquemas externos sólo se deberían resolver desde orígenes de confianza.

Se recomienda deshabilitar el marcador ProcessIdentityConstraints (que está habilitado de manera predeterminada) cuando valide documentos XML de gran tamaño que no sean de confianza en situaciones de alta disponibilidad con un esquema que tiene restricciones de identidad en una gran parte del documento.

Recursos externos

Los datos XML pueden incluir referencias a recursos externos como, por ejemplo, un archivo de esquemas. De manera predeterminada, los recursos externos se resuelven utilizando un objeto XmlUrlResolver sin credenciales de usuario. Esto significa que, de manera predeterminada, puede tener acceso a cualquier ubicación que no requiera credenciales. Puede aumentar la protección aún más realizando cualquiera de las siguientes acciones:

Compartición de objetos XmlReaderSettings

Los objetos XmlReaderSettings pueden contener información confidencial como, por ejemplo, credenciales de usuario. Un componente que no sea de confianza podría utilizar el objeto XmlReaderSettings y sus credenciales de usuario para crear objetos XmlReader para leer datos. Debería tener cuidado al almacenar en caché objetos XmlReaderSettings o al pasar el objeto XmlReaderSettings de un componente a otro.

Admisión de componentes

Procesamiento de datos

Los datos XML pueden contener un gran número de atributos, declaraciones de espacios de nombres, elementos anidados, etc. cuyo procesamiento tarda una cantidad de tiempo importante.

  • Puede crear una implementación de IStream personalizada que limite el tamaño de la entrada que se utiliza y proporcionársela a la clase XmlReader.

  • Utilice el método ReadValueChunk para controlar grandes secuencias de datos. Este método lee una pequeña cantidad de caracteres a la vez en lugar de asignar una única cadena para todo el valor.

Clase XmlTextReader

La clase XmlTextReader es una nueva implementación heredada de la clase XmlReader.

Procesamiento de DTD

El procesamiento de DTD está habilitado de manera predeterminada. Para deshabilitarlo, establezca la propiedad ProhibitDtd en true.

Control de entidades

De manera predeterminada, las entidades generales no se expanden. Lo hacen cuando se llama al método ResolveEntity.

Recursos externos

Los datos XML pueden incluir referencias a recursos externos como, por ejemplo, referencias DTD. De manera predeterminada, los recursos externos se resuelven utilizando un objeto XmlUrlResolver sin credenciales de usuario.

Puede aumentar la protección aún más realizando cualquiera de las siguientes acciones:

Clase XslCompiledTransform

La clase XslCompiledTransform es un procesador XSLT que es compatible con la sintaxis de XSLT 1.0. Permite transformar datos XML utilizando una hoja de estilos XSLT.

Recursos externos

Las hojas de estilos pueden incluir referencias a recursos externos como, por ejemplo, los elementos xsl:import o xsl:include o la función document().

La clase XslCompiledTransform es compatible con los elementos xsl:import o xsl:include de manera predeterminada. La clase XslCompiledTransform deshabilita la compatibilidad con la función document() de manera predeterminada. La clase XsltSettings sirve para habilitar la función document().

Los métodos Load y Transform incluyen sobrecargas que toman un objeto XmlResolver como uno de sus argumentos. Si no se especifica un código XmlResolver, se utiliza una referencia XmlUrlResolver predeterminada sin ninguna credencial.

Puede controlar cómo se obtiene acceso a los recursos externos realizando una de las siguientes acciones:

  • Restrinja los recursos a los que tiene acceso el proceso XSLT utilizando un objeto XmlSecureResolver.

  • No permita que el proceso XSLT abra ningún recurso externo pasando null al argumento XmlResolver.

Bloques de scripts

La clase XslCompiledTransform no es compatible con bloques de scripts de manera predeterminada. Estos bloques se habilitan con la clase XsltSettings. El script XSLT sólo se debería habilitar si necesita compatibilidad con scripts o si está trabajando en un entorno de total confianza.

Objetos de extensión

Los objetos de extensión agregan capacidades de programación a las transformaciones XSLT. Esta característica está habilitada de manera predeterminada. Si se pasan objetos de extensión al método Transform, se utilizan en la transformación XSLT.

Modelo de objetos de documento

Puesto que el Modelo de objetos del documento (DOM) almacena todos los datos en memoria, no se recomienda realizar operaciones DOM (es decir, consultas, ediciones, movimiento de subárboles entre documentos y guardado de objetos DOM) si trabaja con datos que no sean de confianza y le preocupan los ataques de denegación de servicio. Otra opción es establecer un límite a la cantidad de datos que se leen en el DOM. Una forma de hacerlo consiste en crear una implementación de secuencias personalizada que limite el tamaño de las entradas utilizadas y la utilice para cargar el objeto DOM:

Los objetos XmlDocument pueden contener información confidencial como, por ejemplo, credenciales de usuario en el objeto XmlResolver incrustado. Si se establece la propiedad XmlDocument.XmlResolver en un objeto XmlResolver con credenciales de usuario, no debería almacenar en caché el objeto XmlDocument ni pasarlo a un componente que no sea de confianza. Ese componente podría utilizar el objeto DOM y las credenciales de usuario de XmlResolver incrustadas para tener acceso a los datos y cargarlos.

Vea también

Conceptos

Directrices de codificación de System.Xml