Hola, encontramos la solución a tu pregunta, continúa leyendo y la obtendrás aquí.
Solución:
Primero, algunos antecedentes.
¿Qué es un DTD?
El documento que intenta analizar contiene una declaración de tipo de documento; si observa el documento, encontrará cerca del comienzo una secuencia de caracteres que comienza con y terminando con el correspondiente
>
. Tal declaración permite que un procesador XML valide el documento contra un conjunto de declaraciones que especifican un conjunto de elementos y attributes y restringen qué valores o contenidos pueden tener.
Dado que las entidades también se declaran en las DTD, una DTD permite que un procesador sepa cómo expandir las referencias a las entidades. (La entidad pubdate
puede definirse para contener la fecha de publicación de un documento, como "15 de diciembre de 2012", y se menciona varias veces en el documento como &pubdate;
-- dado que la fecha real se da solo una vez, en la declaración de la entidad, este uso facilita mantener las diversas referencias a la fecha de publicación en el documento coherentes entre sí.)
¿Qué significa un DTD?
La declaración del tipo de documento tiene un significado puramente declarativo: un esquema para este tipo de documento, en la sintaxis definida en la especificación XML, se puede encontrar en tal o cual ubicación.
Algunos programas escritos por personas con una comprensión débil de los fundamentos de XML sufren de una confusión elemental sobre el significado de la declaración; asume que el significado de la declaración del tipo de documento no es declarativo (allí hay un esquema) pero imperativo (por favor valide este documento). El analizador que está utilizando parece ser un analizador de este tipo; asume que al entregarle un documento XML que tiene una declaración de tipo de documento, ha solicitado un cierto tipo de procesamiento. Sus autores podrían beneficiarse de un curso de recuperación sobre cómo aceptar parámetros de tiempo de ejecución del usuario. (Ves lo difícil que es para algunas personas entender la semántica declarativa: incluso los creadores de algunos analizadores XML a veces no los entienden y en su lugar se deslizan hacia el pensamiento imperativo. Suspiro).
¿Cuáles son esas 'razones de seguridad' de las que hablan?
Algunas personas preocupadas por la seguridad han decidido que el procesamiento de DTD (validación o expansión de entidad sin validación) constituye un riesgo de seguridad. Usando la expansión de entidades, es fácil hacer un flujo de datos XML muy pequeño que se expande, cuando todas las entidades están completamente expandidas, en un documento muy grande. Busque información sobre lo que se llama el "ataque del billón de risas" si desea leer más.
Una forma obvia de protegerse contra el ataque del billón de risas es que aquellos que invocan un analizador en datos proporcionados por el usuario o que no son de confianza invoquen el analizador en un entorno que limita la cantidad de memoria o el tiempo que puede consumir el proceso de análisis. Dichos límites de recursos han sido partes estándar de los sistemas operativos desde mediados de la década de 1960. Sin embargo, por razones que siguen siendo oscuras para mí, algunas personas preocupadas por la seguridad creen que la respuesta correcta es ejecutar analizadores en entradas que no son de confianza. sin límites de recursoscon la aparente creencia de que esto es seguro siempre que haga imposible validar la entrada contra un esquema acordado.
Es por eso que su sistema le dice que sus datos tienen un problema de seguridad.
Para algunas personas, la idea de que los DTD son un riesgo para la seguridad suena más a paranoia que a sentido común, pero no creo que sean correctos. Recuerde (a) que una paranoia saludable es lo que los expertos en seguridad necesitan en la vida, y (b) que cualquier persona realmente interesada en la seguridad insistiría en los límites de recursos en cualquier caso; en presencia de límites de recursos en el proceso de análisis, las DTD son inofensivo. La prohibición de los DTD no es paranoia sino fetichismo.
Ahora, con ese trasfondo fuera del camino...
¿Cómo solucionas el problema?
La mejor solución es quejarse amargamente a su proveedor de que ha sido engañado por un cuento de viejas sobre la seguridad XML y decirle que si le importa la seguridad, debería hacer un análisis de seguridad racional en lugar de prohibir las DTD.
Mientras tanto, como sugiere el mensaje, puede "establecer la propiedad ProhibitDtd en XmlReaderSettings para false y pase la configuración al método XmlReader.Create". Si la entrada no es de confianza, también puede buscar formas de dar al proceso límites de recursos apropiados.
Y como alternativa (no lo recomiendo), puede comentar la declaración del tipo de documento en su entrada.
Tenga en cuenta que settings.ProhibitDtd ahora está obsoleto, use DtdProcessing en su lugar: (nuevas opciones de Ignorar, Analizar o Prohibir)
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
y como se indica en esta publicación: ¿Cómo funciona el ataque XML DoS del billón de risas?
debe agregar un límite a la cantidad de caracteres para evitar ataques DoS:
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.MaxCharactersFromEntities = 1024;
En cuanto a arreglar esto, con un poco de búsqueda encontré que era tan simple como agregar:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
y pasar esta configuración al método de creación.
[UPDATE 3/9/2017]
Como algunos han señalado, .ProhibitDTDT ahora está obsoleto. La respuesta del Dr. Aaron Dishno, a continuación, muestra la solución superior