在javaxxml验证程序中禁用DTD

在javaxxml验证程序中禁用DTD,java,xml,security,xml-validation,owasp,Java,Xml,Security,Xml Validation,Owasp,我正在使用验证我的xml,如下所示- Validator validator = myschema.newValidator(); validator.validate(new StreamSource(new StringReader(xmlString))); 我希望通过完全禁用DTD(文档类型定义)来防止XML外部实体攻击,因此如果可能的话,我希望验证器在XML中出现DTD时抛出异常。我读过关于使用DocumentBuilderFactory执行此操作的内

我正在使用验证我的xml,如下所示-

        Validator validator = myschema.newValidator();
        validator.validate(new StreamSource(new StringReader(xmlString)));
我希望通过完全禁用DTD(文档类型定义)来防止XML外部实体攻击,因此如果可能的话,我希望验证器在XML中出现DTD时抛出异常。我读过关于使用
DocumentBuilderFactory
执行此操作的内容。如何在Validator中配置此功能?

根据for Java,以下功能应该可以正常工作:

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 ...
有关更多详细信息,请参阅。

这也可以-

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Schema myschema = factory.newSchema();

Validator validator = myschema.newValidator();

validator.validate(new StreamSource(new StringReader(xmlString)));

这样就不会因为安全问题而丢掉质量。您可以将其用于DTD文件的本地(已检查)副本。该副本当前不起作用。我们发现此异常属性“”未被识别。@GaneshBhat-您可能希望打开一个新的SA问题,发布安装的详细信息,包括Java版本、XML提供程序供应商和版本,等。如果你这样做,请随意链接这里。这对我不起作用,因为现在我得到一个SAXParseException,因为验证程序无法访问外部文件,因为该选项。实际上,问题的标题建议完全禁用dtd,而相反的文本明确提到了xml的远程检索resources@usr-本地-ΕψΗΕ∧ΝΝ,文本还指定“完全禁用DTD[…]”。在您的案例中,您是否为
ACCESS\u EXTERNAL\u DTD
选项提供了一个与您的DTD所在位置相匹配的方案,例如
jar:file
(如果它们位于本地jar中)?我没有。我只是想完全禁用DTD验证。你可能会问这是为了什么。。。我有一个官方的XSD,它相当于DTD,我将它提供给我的验证器。但是验证程序一旦检测到XML主体中存在DTD声明,就需要加载DTD。极好的也许我只是想在这个阶段根据正确的XML完整性验证文档,然后再执行其他检查。这就是我评论的重点。是的,我知道“完全”是问题文本的一部分,我现在为此道歉。