2015-08-19 6 views
6

Я исследовал на эту тему, но не мог найти любую соответствующую информацию о том, чтоКак обезопасить javax.xml.transform.TransformerFactory от XML внешних атак

Нужен ли принимать какое-либо измерение безопасности для обеспечения 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()); 

выход содержит значение из файла

<username>test</username> 

ответ

3

Ваш код кажется правильным. Когда я запускаю это слегка модифицированный тест 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.' 

Из setFeatureJavaDocs:

Все реализации необходимы для поддержки 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 не является точной, поэтому одна реализация может сделать что-то другое, чем другое. Мне было бы интересно узнать о неправильных реализациях!