我已就此主题进行了研究,但未找到相关的相关信息
我们是否需要采取任何安全措施来保护javax.xml.transform.Transformer免受XML外部实体攻击?
我做了以下,似乎扩大了dtd.
String fileData = "<!DOCTYPE acunetix [ <!ENTITY sampleVal SYSTEM \"file:///media/sample\">]><username>&sampleVal;</username>";
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Transformer transformer = transformerFactory.newTransformer();
StringWriter buff = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new StreamSource(new StringReader(fileData)), new StreamResult(buff));
System.out.println(buff.toString());
Run Code Online (Sandbox Code Playgroud)
output包含文件中的值
<username>test</username>
Run Code Online (Sandbox Code Playgroud)
小智 5
你的代码似乎是正确的。当我运行这个稍微修改过的 JUnit 测试用例时:
@Test
public void test() throws TransformerException, URISyntaxException {
File testFile = new File(getClass().getResource("test.txt").toURI());
assertTrue(testFile.exists());
String fileData = "<!DOCTYPE acunetix [ <!ENTITY foo SYSTEM \"file://" +
testFile.toString() +
"\">]><xxe>&foo;</xxe>";
TransformerFactory transformerFactory = TransformerFactory.newInstance();
System.out.println(transformerFactory.getClass().getName());
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Transformer transformer = transformerFactory.newTransformer();
StringWriter buff = new StringWriter();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new StreamSource(new StringReader(fileData)), new StreamResult(buff));
assertEquals("<xxe>&foo;</xxe>", buff.toString());
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
[Fatal Error] :1:182: External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.
ERROR: 'External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.'
Run Code Online (Sandbox Code Playgroud)
从setFeature
JavaDocs:
所有实现都需要支持 XMLConstants.FEATURE_SECURE_PROCESSING 功能。当特征是:
- true:实现将限制 XML 处理以符合实现限制并以实现定义的安全方式运行。示例包括解析用户定义的样式表和函数。如果出于安全原因限制了 XML 处理,则会通过调用注册的 ErrorListener.fatalError(TransformerException exception) 来报告。请参阅 setErrorListener(ErrorListener 侦听器)。
如果我注释掉transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
然后测试失败,因为实体已解析,该错误就会消失。
尝试向 TransformerFactory 和 Transformer 添加一个 ErrorListener:
transformerFactory.setErrorListener(new ErrorListener() {
@Override
public void warning(TransformerException exception) throws TransformerException {
System.out.println("In Warning: " + exception.toString());
}
@Override
public void error(TransformerException exception) throws TransformerException {
System.out.println("In Error: " + exception.toString());
}
@Override
public void fatalError(TransformerException exception) throws TransformerException {
System.out.println("In Fatal: " + exception.toString());
}
});
Transformer transformer = transformerFactory.newTransformer();
transformer.setErrorListener(transformerFactory.getErrorListener());
Run Code Online (Sandbox Code Playgroud)
我现在看到以下新的控制台输出:
In Error: javax.xml.transform.TransformerException: External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.
Run Code Online (Sandbox Code Playgroud)
也许您的实现将其视为警告?否则,也许这是您正在使用的实现?看起来 JavaDoc 规范并不精确,所以一个实现可能会做一些与另一个不同的事情。我很想知道错误的实现!
归档时间: |
|
查看次数: |
4939 次 |
最近记录: |