xml 文档中禁止 DTD 异常

2024-01-28

当尝试在 C# 应用程序中解析 XML 文档时,我收到此错误:

“出于安全原因,此 XML 文档中禁止 DTD。要启用 DTD 处理,请将 XmlReaderSettings 上的 ProhibitDtd 属性设置为 false,并将设置传递到 XmlReader.Create 方法。”

作为参考,异常发生在以下代码的第二行:

using (XmlReader reader = XmlReader.Create(uri))
{
    reader.MoveToContent(); //here

    while (reader.Read()) //(code to parse xml doc follows).

我对 Xml 的了解非常有限,我不知道 DTD 处理是什么,也不知道如何执行错误消息所建议的操作。对于可能导致此问题的原因以及如何解决它有任何帮助吗?谢谢...


首先,一些背景知识。

什么是 DTD?

您尝试解析的文档包含文档类型声明;如果您查看该文档,您会在开头附近发现一系列以<!DOCTYPE并以相应的结尾>。这样的声明允许 XML 处理器根据一组声明来验证文档,这些声明指定一组元素和属性并限制它们可以具有的值或内容。

由于实体也在 DTD 中声明,因此 DTD 允许处理器知道如何扩展对实体的引用。 (实体pubdate可以定义为包含文档的发布日期,例如“2012 年 12 月 15 日”,并在文档中多次引用为&pubdate;-- 由于在实体声明中实际日期仅给出一次,因此这种用法可以更轻松地保持文档中对发布日期的各种引用彼此一致。)

DTD 是什么意思?

文档类型声明具有纯粹的声明性含义:按照 XML 规范中定义的语法,可以在某处找到此文档类型的模式。

有些软件是由对 XML 基础知识掌握较弱的人编写的,他们对声明的含义存在基本的混淆。它假设文档类型声明的含义不是陈述性的(那里有一个模式)但是至关重要的(请验证此文件)。您正在使用的解析器似乎就是这样的解析器;它假定通过向其提供具有文档类型声明的 XML 文档,您已请求某种处理。其作者可能会受益于有关如何接受用户的运行时参数的补习课程。 (您会发现,对于某些人来说,理解声明性语义是多么困难:甚至某些 XML 解析器的创建者有时也无法理解它们,而是陷入了命令式思维。唉。)

他们所说的“安全原因”是什么?

一些具有安全意识的人认为 DTD 处理(验证或未经验证的实体扩展)构成安全风险。使用实体扩展,可以轻松创建非常小的 XML 数据流,当所有实体完全扩展时,该数据流将扩展为非常大的文档。如果您想了解更多信息,请搜索有关所谓“十亿笑声攻击”的信息。

防止十亿笑声攻击的一种明显方法是,对于那些对用户提供的或不受信任的数据调用解析器的人来说,在限制允许解析过程消耗的内存量或时间的环境中调用解析器。自 20 世纪 60 年代中期以来,此类资源限制一直是操作系统的标准部分。然而,由于我仍然不清楚的原因,一些具有安全意识的人认为正确的答案是在不受信任的输入上运行解析器无资源限制,显然相信只要您无法根据商定的模式验证输入,这就是安全的。

这就是为什么您的系统告诉您您的数据存在安全问题。

对于某些人来说,DTD 是一种安全风险的想法听起来更像是偏执而不是理智,但我不认为它们是正确的。请记住 (a) 健康的偏执是安全专家在生活中所需要的,并且 (b) 任何真正对安全感兴趣的人在任何情况下都会坚持资源限制——在解析过程存在资源限制的情况下,DTD 是无害。禁止 DTD 并不是偏执而是拜物教。


现在,随着背景的消失......

你如何解决这个问题?

最好的解决方案是向您的供应商强烈抱怨他们被有关 XML 安全性的老太太的故事所欺骗,并告诉他们如果他们关心安全性,他们应该进行合理的安全分析而不是禁止 DTD。

同时,正如消息所示,您可以“将 XmlReaderSettings 上的 ProhibitDtd 属性设置为 false,并将设置传递到 XmlReader.Create 方法中”。如果输入实际上不受信任,您还可以考虑为进程提供适当的资源限制的方法。

作为后备(我不推荐这样做),您可以注释掉输入中的文档类型声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xml 文档中禁止 DTD 异常 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • Pyside6:从 QTableWidget 复制粘贴、删除、撤消多个单元格

    我希望能够使用 control C control V 在 Pyside6 表 QTableWidget 之间进行复制和粘贴 主要是在 Excel 之间进行复制和粘贴 我找到了 Momo 2023 年 1 月的帖子 1 https stac
  • JavaScript 闭包。在循环中访问当前 i、j 变量[重复]

    这个问题在这里已经有答案了 我尝试动态生成 table 使用 jQuery 我想为每个单元格设置单击处理程序 因此当单元格单击时 弹出窗口将显示单元格的当前索引 我如何访问 CURRENTi and j循环中的变量 for var i 0
  • 如何使用不同的服务帐户凭据验证谷歌API?

    任何曾经不幸以编程方式与 Google CLI 二进制文件进行交互的人都会意识到 可以使用以下工具进行身份验证gcloud gsutil bq等远非直观或琐碎 尤其当您需要跨不同项目工作时 我正在为不同的项目运行与 Google Cloud
  • 在 Ubuntu Linux 上安装功能齐全的 PostGIS 2.0 GEOS/GDAL 问题

    我一直致力于在 ubuntu maverick amd64 Linux 服务器上启动并运行 postgis 2 0 大约一周 我正在寻求栅格和拓扑支持 我使用以下内容进行配置 sudo configure with raster with
  • JAXB RI ClassFactory 中的空指针异常

    Intro 我和我的朋友正在开发一个 JavaFX 应用程序 该应用程序充当我们学校的规划器 我们有任务 课程作业 活动 课程和学生信息 为了将数据持久存储在用户的硬盘上 我们使用了 JAXB 我们已经注释了我们的类 并且可以成功地将 Ta
  • 使用 Flexbox 具有相同高度元素的多行网格

    我正在尝试创建一个具有多行和多列的网格 我希望使用 Flexbox 使它们都具有相同的高度 但我唯一能得到的是一行上具有相同大小的列 这是我正在尝试做的事情的一个例子 http jsbin com maxavahesa 1 edit htm
  • 如何在 OSX 上替换 Python 中的“关于 Tkinter”菜单

    编辑 我指的是 OSX 应用程序菜单 其中包含 关于 和 首选项 菜单项 以及其他菜单项 对于知道正确搜索词的人来说 也许这将是另一个简单的过程 但是在花费数小时在 IDLE 中跟踪代码并搜索网络之后 我还没有完全能够将这些点联系起来 我正
  • 以编程方式从 DataTable 创建 DataGridview

    我有以下代码 DataTable table new DataTable DataTable is filled with values here DataGridView grid new DataGridView foreach Dat
  • Javascript charAt() 打破多字节字符串

    此代码在 Nodejs v0 10 21 中崩溃 usr bin env node use strict var urlEncoded http zh wikipedia org wiki F0 A8 A8 8F var urlDecode
  • Python请求,如何将内容类型添加到multipart/form-data请求

    我使用 python requests 通过 PUT 方法上传文件 远程 API 仅当正文包含属性时才接受任何请求 Content Type i mage png 不作为请求标头 当我使用 python requests 时 请求因缺少属性
  • 迭代器性能

    与直接使用指针相比 实现和使用迭代器是否会带来任何类型的性能损失 假设我们使用最高的编译器优化 代码来自http www cplusplus com reference iterator iterator http www cplusplu
  • 迭代器实现应该如何处理检查异常?

    我将 java sql RecordSet 包装在 java util Iterator 中 我的问题是 如果任何记录集方法抛出 SQLException 我该怎么办 The java util Iterator javadoc http
  • 如何在eclipse中运行maven项目

    我有一个带有 TestNG 的 Java Maven 项目 我想从 eclipse 运行它 我使用 Eclipse Kepler 并安装了 m2eclipse 插件 但是菜单 Run as 中没有任何与 maven 连接的选项 有人可以帮我
  • 当我单击“确定”按钮时,Android AlertDialog 总是退出

    有没有办法在单击 确定 后进行验证 我没有忽略它 但当我单击 确定 时它会关闭 我编写了一个使用一些编辑文本的自定义 AlertDialog 问题是我无法验证任何内容 如果验证失败 我想更改消息并告诉用户 但它只是关闭 我正在使用Alert
  • Blazor 服务器应用程序中的 HttpContext.Session

    我正在尝试使用HttpContext Session在我的 ASP NET Core Blazor Server 应用程序中 如此处所述MS Doc https learn microsoft com en us aspnet core f
  • TCPDF:将文本剪切到单元格宽度

    我正在广泛使用 TCPDF 的 Cell 方法生成 PDF 报告 使用 Cell 方法打印的文本超出了方法中指定的宽度 我只想打印适合指定宽度的文本部分 但不要溢出或换行到下一行 我不想要字体拉伸策略 我搜索了很多但找不到解决方案 还有其他
  • 如何优雅地为具有多态关联的模型构建表单?

    这是我的模型 class Lesson lt ActiveRecord Base belongs to topic polymorphic gt true validates presence of topic type topic id
  • 如何检测三角形区域的触摸

    对于我的应用程序 我需要将 iPhone 的屏幕对角线分成 4 个部分 并检测哪个部分被触摸 我很困惑 因为我的区域是三角形而不是正方形 我找不到解决方案来检测哪个三角形被触摸 我用 TouchBegan 方法得到了被触摸的点 然后我被卡住
  • 收到电子邮件时电子表格自动更新(发布/订阅)但信息错误[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在 Google Cloud Platform 上设置了第一个 Pub Sub 它使用 Gmail API 在每次收到电子邮件时更新
  • xml 文档中禁止 DTD 异常

    当尝试在 C 应用程序中解析 XML 文档时 我收到此错误 出于安全原因 此 XML 文档中禁止 DTD 要启用 DTD 处理 请将 XmlReaderSettings 上的 ProhibitDtd 属性设置为 false 并将设置传递到