Ваш код кажется правильным. Когда я запускаю это слегка модифицированный тест 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());
}
я получаю следующий результат:
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.'
Из setFeature
JavaDocs:
Все реализации необходимы для поддержки XMLConstants. FEATURE_SECURE_PROCESSING. Когда функция имеет значение:
- true: реализация ограничит обработку XML, чтобы она соответствовала пределам реализации и вела себя безопасным образом, как определено реализацией. Примеры включают разрешение пользовательских таблиц стилей и функций. Если обработка XML ограничена по соображениям безопасности, она будет отправлена по вызову зарегистрированного исключения ErrorListener.fatalError (исключение TransformerException). См. SetErrorListener (прослушиватель ErrorListener).
Эта ошибка уходит, если я закомментировать transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
, а затем тест не пройден, потому что объект не будет решен.
Try добавление ErrorListener к обоим TransformerFactory и Transformer:
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());
Я вижу следующий новый консольный вывод теперь:
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.
Может быть, ваша реализация интерпретируемого как предупреждение? В противном случае, возможно, это реализация, которую вы используете? Похоже, что спецификация JavaDoc не является точной, поэтому одна реализация может сделать что-то другое, чем другое. Мне было бы интересно узнать о неправильных реализациях!