У нас был аудит безопасности нашего кода, и они упоминали, что наш код уязвим для атаки внешнего сустава (XXE).Как предотвратить атаку XXE
Пояснения- Атаки с внешних объектов XML используют функцию XML для динамического создания документов во время обработки. Объект XML позволяет динамически включать данные из заданного ресурса. Внешние объекты позволяют документу XML включать данные из внешнего URI. Если это не сделано иначе, внешние сущности вынуждают синтаксический анализатор XML обращаться к ресурсу, указанному , посредством URI, например, файла на локальном компьютере или в удаленной системе. Такое поведение предоставляет приложение для внешних внешних атак типа Entity (XXE), которые могут использоваться для отказа в обслуживании локальной системы, получения несанкционированного доступа к файлам на локальном компьютере , сканирования удаленных компьютеров и выполнения отказа в обслуживании удаленных систем. В следующем XML-документе показан пример атаки XXE.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>
Этот пример может обрушить сервер (в системе UNIX), если XML-парсер пытается заменить объект с содержимым /DEV/случайный файл.
Рекомендация- XML-маркер не должен быть настроен безопасно, чтобы он не позволял внешним объектам как часть входящего документа XML . Чтобы избежать инъекции XXE, не используйте методы, которые обрабатывают XML-источник напрямую, как java.io.File, java.io.Reader или java.io.InputStream. Разобрать документ с надежно сконфигурированного анализатором и использовать распаковать метод, который принимает безопасный
анализатор в качестве источника XML, как показано в следующем примере:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(<XML Source>);
Model model = (Model) u.unmarshal(document);
И написанный код ниже, где нашел нападение XXE -
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
System.out.println("outputing to : " + outputLocation);
File outputFile = new File(outputLocation);
StreamResult result = new StreamResult(outputFile);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
Пожалуйста, помогите, как я могу реализовать вышеприведенную рекомендацию в своем коде.
Может ли кто-нибудь помочь, где я не хватает предметов? Любая помощь приветствуется!
Спасибо за ответ, да, но мне нужно реализовать DocumentBuilderFactory в существующей логике .... btw я использовал ваше задание, но получаю ошибку «Метод setFeature (String, boolean) не определен для типа Transformer». – SANNO
Эх, извините, вам нужно установить его в TransformerFactory. – Kayaman
Спасибо, Kayaman! его рабочий тон, но вы можете помочь заменить концепцию TransformerFactory концепцией DocumentBuilderFactory. На самом деле это будет заметно. – SANNO