在 javax XML 验证器中禁用 DTD

Ank*_*agi 5 java xml security xml-validation owasp

我正在使用javax.xml.validation.Validator来验证我的 xml,如下所示 -

        Validator validator = myschema.newValidator();
        validator.validate(new StreamSource(new StringReader(xmlString)));
Run Code Online (Sandbox Code Playgroud)

我想通过完全禁用 DTD(文档类型定义)来防止 XML 外部实体攻击,所以如果可能的话,我希望验证器在我的 xml 中出现 DTD 的情况下抛出异常。我已阅读有关使用DocumentBuilderFactory. 我如何在 Validator 中配置它?

小智 4

根据Java 的OWASP XXE 预防电子表格,以下内容应该有效:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema myschema = factory.newSchema();
Validator validator = myschema.newValidator();
try {
  validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
  validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
  validator.validate(new StreamSource(new StringReader(xmlString)));
} catch ...
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅XMLConstantsJavaDocs 。

  • 好吧,我没有。我只是想完全禁用 DTD 验证。您可能会问这样做的目的是什么......好吧,我有一个相当于 DTD 的官方 XSD,并将其提供给我的验证者。但是验证器一旦检测到 XML 的 **body** 中存在 DTD 声明,就会要求加载 DTD。了不起。也许我只是想*在此阶段*根据正确的 XML 完整性验证文档,并稍后执行其他检查。这就是我评论的重点。是的,我看到“完全”是问题文本的一部分,我现在为此道歉。 (2认同)