2

XML 文件用作 REST Web 服务之间的数据交换格式。这些服务的设计使得在 XML 文件中永远不需要外部实体引用。我想要的是有一个防止此类引用的 XSD 架构。

我对此的想法是创建一个使用正则表达式的模式文件,例如:

<xs:simpleType name="stringValue">
    <xs:restriction base="xs:string">
        <xs:pattern value="^[a-zA-Z -]{2,32}$" />
    </xs:restriction>
</xs:simpleType>

如果像这样的实体<foo>&externalRef</foo>得到验证,它将失败,因为 & 字符不是正则表达式的一部分!

有哪些其他措施可以实现这一目标?

4

1 回答 1

2

不,您想要的约束不能用 XSD 表达。

XSD 对 XML 信息集(通常由 XML 解析器生成的信息集)进行操作,构成其输入的信息项不保留有关 XML 文档的原始实体结构的信息。

那些(像你一样)希望在 XML 输入中禁止实体引用的人通常会通过一个特定的规则来做到这一点,或者如果他们在信息集级别上操作,则通过禁止信息集以反映存在的规则文档类型声明。

【后期补充】 最后一点似乎很难消化。考虑一个规范(例如 SOAP 规范),它希望在 XML 信息集级别而不是在 XML 字符流级别定义其操作和约束。也就是说,它想要谈论元素和属性,而不是尖括号。同时,它想禁止实体引用。这样的规范不能禁止使用用 XSD(或 DTD、Relax NG 或 Schematron,...它们操作的抽象。。但是任何规范都可以限制信息集的集合,这些信息集可以作为符合流程的输入。(毕竟,当我们说“根元素必须是名称 foo: bar 并具有 baz 属性',对吗?我们正在定义一个符合要求的处理器应该支持的输入信息集集。)因此,规范希望像 SOAP 一样在信息集级别定义事物,并且还希望像 SOAP 一样禁止实体引用,通常(在至少,根据我的经验)说“文档信息项不得在其子项中包含任何文档类型声明信息项。”这种技术可能只对标准书呆子和语言律师很重要,但对于那些关心 XML 和 XML 标准的人来说,了解 SOAP 如何关于禁止实体引用以及为什么包括我在内的一些人认为这是一个坏主意。[结束添加]

由于格式良好的 XML 文档中的所有实体引用都引用文档类型定义中声明的实体,因此缺少文档类型声明就足以使除预定义实体(ltgtaposquot)之外的所有实体都成为不可能。

你的技术问题现在已经回答了,但如果我没有指出,从每一个衡量标准来看,我都可以想象你的目标是不明智的。

如果您和其他人(如 SOAP 的发明者)允许 XML 文档的创建者按照指定的方式使用 XML,世界将会(这里说)变得更好。 可能不需要实体引用,而管理您不负责的系统的人可能会看到这种需要。你真的认为你比他们更了解他们的系统和工作流程吗?为什么要通过定义 XML 的临时子集而不是按照指定和实现的方式使用它来为自己和他人工作?对此的通常反应是对十亿笑攻击的恐惧,这是(它在这里说)一个完全虚假的论点。通过让 XML 解析器对实体替换文本的最大长度施加限制,或者通过在操作系统施加资源限制的进程中运行 XML 解析器(和其他处理不可信输入的进程),可以更好地处理资源攻击。

于 2013-08-13T16:30:07.200 回答