2015-08-13 2 views
2

Инструмент анализатора кода уведомляет о XML Entity Expansion Injection, потому что нет спецификации DTD.Каков эффект игнорирования спецификации DTD в java?

Так я хочу, чтобы отключить в DTD проверки спецификации по

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

Так что я хотел бы знать,

  1. Будет ли перерыв фактического кода потока?
  2. Это вызовет больше проблем?
  3. Есть ли другой способ справиться с этим?

ответ

2

Чтобы использовать парсер безопасно, вы должны явно отключить XXE в парсере, который вы используете. Ниже описано, как отключить XXE в наиболее часто используемых синтаксических анализаторах XML для Java.

JAXP DocumentBuilderFactory и SAXParserFactory

Оба DocumentBuilderFactory и SAXParserFactory Парсеры XML можно настроить с помощью тех же методов, чтобы защитить их от XXE. Здесь представлен только пример DocumentBuilderFactory.

  • Метод JAXP DocumentBuilderFactory setFeature позволяет разработчику контролировать, какие специфичные для реализации функции процессора XML являются включить или отключить

.

  • Каждая реализация процессора XML имеет свои собственные функции, которые определяют, как обрабатываются DTD и внешние сущности.

Для синтаксиса выделенного фрагмента кода для DocumentBuilderFactory нажмите here.

Для синтаксиса выделенного фрагмента кода для SAXParserFactory нажмите here.

Ссылки предоставят вам полную информацию о том, как использовать DTD для обоих парсеров.

Xerces 1 Особенности:

Не включайте внешние объекты, установив эту функцию в ложь. Не включайте объекты параметров, установив для этой функции значение false.

Xerces 2 Особенности:

DISALLOW инлайн DTD, установив эту функцию, чтобы верно. Не включайте внешние объекты, установив для этой функции значение false. Не включайте объекты параметров, установив для этой функции значение false. StAX и XMLInputFactory Анализаторы StAX, такие как XMLInputFactory, позволяют устанавливать различные свойства и функции.

Для защиты Java XMLInputFactory от XXE, сделайте следующее:

xmlInputFactory.setProperty (XMLInputFactory.SUPPORT_DTD, ложь); // Это полностью отключает DTD для этого завода

1

В идеале, мы не должны отключать проверку спецификации DTD. Вместо этого используйте EntityResolver для обхода проверки DTD в случае, если конкретный DTD не найден.

Вот как вы создаете DocumentBuilder, который будет игнорировать все внешние ссылки объектов, в том числе ОТДА:

final DocumentBuilder builder = factory.newDocumentBuilder(); 
builder.setEntityResolver(new EntityResolver() { 
    @Override 
     public InputSource resolveEntity(String publicId, String systemId) { 
       // it might be a good idea to insert a trace logging here that you are ignoring publicId/systemId 
       return new InputSource(new StringReader("")); // Returns a valid dummy source 
     } 
    }); 

В качестве альтернативы, вы можете также сделать следующее:

final DocumentBuilder builder = factory.newDocumentBuilder(); 
builder.setEntityResolver(new EntityResolver() { 
      public InputSource resolveEntity(java.lang.String publicId, java.lang.String systemId) 
       throws SAXException, java.io.IOException 
      { 
      if (publicId.equals("--DTDpublicID--")) 
       // this deactivates the DTD 
       return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes())); 
      else return null; 
      } 
}); 
+0

Не могли бы вы принять ответ, если он вам помог? Спасибо. –

Смежные вопросы