2016-08-02 76 views
1

我使用javax.xml.validation.Validator验证如下我的XML -禁用DTD中的javax XML验证

 Validator validator = myschema.newValidator(); 
     validator.validate(new StreamSource(new StringReader(xmlString))); 

我想通过完全禁用的DTD(文档类型定义),以防止XML外部实体攻击,所以我就像验证器在我的xml中如果可能的话在DTD的情况下抛出异常一样。我已阅读使用DocumentBuilderFactory这样做。我如何在Validator中进行配置?

+0

为了不丢掉质量的安全。您可以使用[** XML目录**](https://en.wikipedia.org/wiki/XML_Catalog)作为DTD文件的本地(已检查)副本 –

回答

2

按照OWASP XXE prevention spreadsheet为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 ... 

参考XMLConstants JavaDocs了解更多详情。

+0

非常感谢! –

+0

目前无法使用。我们得到这个例外 无法识别属性'http://javax.xml.XMLConstants/property/accessExternalDTD'。 –

+0

@GaneshBhat - 您可能想要打开一个新的SA问题,发布您的设置详细信息,包括Java版本,XML提供程序供应商和版本等。如果您愿意,请随时链接。 – coastalhacking