В архиве нет файла xml

Обновлено: 21.11.2024

Office 365 профессиональный плюс переименовывается в Приложения Microsoft 365 для предприятий. Для получения дополнительной информации об этом изменении прочитайте эту запись в блоге.

Симптомы

Рассмотрите следующий сценарий. Вы пытаетесь открыть документ в Microsoft Office Word 2007, Microsoft Word 2010 или Microsoft Word 2013, использующий один из следующих форматов файлов:

  • Документ Word (.DOCX)
  • Документ Word с поддержкой макросов (.DOCM)
  • Шаблон Word (.DOTX)
  • Шаблон Word с поддержкой макросов (.DOTM)
  • XML-документ Word (.XML)
  • XML-документ Word 2003 (.XML)

Во время открытия Word 2007, Word 2010 или Word 2013 появляется следующее сообщение об ошибке:

Файл содержит пользовательские элементы XML, которые больше не поддерживаются Word. Если вы сохраните этот файл, эти пользовательские элементы XML будут удалены навсегда.

После нажатия кнопки "ОК" пользовательские элементы XML не отображаются.

Microsoft Word 2013 отображает сообщение об ошибке для следующих форматов файлов в дополнение к ранее перечисленным форматам файлов:

  • Документ Word 97-2003 (.DOC)
  • Веб-страницы Word (.HTML)
  • Расширенный текстовый формат (.RTF)

Дополнительная информация

Версии Word, распространяемые Microsoft после 10 января 2010 г., больше не считывают пользовательскую разметку XML, которая может содержаться в файлах .DOCX, .DOCM, .DOTX, .DOTM или .XML. Новые версии Word 2007, Word 2010 и Word 2013 по-прежнему могут открывать эти файлы, но вся пользовательская разметка XML удаляется.

Пользовательская разметка XML в документе Word отображается как розовые (цвет по умолчанию) имена тегов, окружающие текст в документе:

Удаление пользовательской XML-разметки является результатом решения суда США от 22 декабря 2009 г. Как правило, клиенты, приобретающие или лицензирующие Word 2007, Word 2010 или Word 2013 у Microsoft после 10 января 2010 г. для использования в Соединенные Штаты и их территории должны использовать обновленное программное обеспечение, которое не включает конкретную реализацию XML-тегов.

Обновление не затрагивает следующие функции Word.

Элементы управления контентом не затрагиваются. Элементы управления содержимым — это распространенный метод структурирования содержимого документа и сопоставления содержимого с пользовательскими частями XML.

Стандарты Open XML (все версии ECMA и ISO) не затрагиваются.

Пользовательская разметка XML, хранящаяся в файлах документов Word 97-2003 (.DOC), не затрагивается.

XML ленты и расширяемость ленты не затронуты.

Пользовательские части XML не затрагиваются. Дополнительные сведения о пользовательских XML-частях см. в разделе Обзор настраиваемых XML-частей.

Объектная модель Word не затрагивается. Однако некоторые методы объектной модели, работающие с пользовательской XML-разметкой, могут давать другие результаты.

  • Метод TransformDocument будет продолжать работать, но любая пользовательская XML-разметка в результатах преобразования будет удалена.
  • Метод InsertXML будет продолжать работать, но любая имеющаяся пользовательская XML-разметка будет удалена перед вставкой содержимого.

Если вы являетесь разработчиком решения, использующего пользовательскую разметку XML, имейте в виду, что поддержка пользовательской разметки XML больше не доступна. Многие из сценариев, реализованных с помощью пользовательской разметки XML, можно реализовать с помощью альтернативных технологий, таких как элементы управления содержимым, поля форм и закладки, которые доступны в Word 2007, Word 2010 и Word 2013. Например, как описано в следующих статьях. , элементы управления содержимым (в дополнение к этим другим технологиям, таким как закладки) позволяют разработчикам создавать структурированные документы и могут использоваться для присвоения произвольных значений структурированному содержимому. Эти произвольные значения можно использовать для придания семантического значения частям вашего контента.

Для получения дополнительных сведений об элементах управления содержимым посетите следующие веб-страницы Microsoft:

В связи с запланированным отключением электроэнергии в пятницу, 14 января, с 8:00 до 13:00 по тихоокеанскому стандартному времени некоторые службы могут быть недоступны.

Плакат: Брэд Леблан Дата: 14 января 2006 г., 1:04
Форум: etree Тема: Информация о файлах XML (метаданные) и производном

Привет, ребята, в интересах обучения наших покровителей кураторы подумали, что было бы неплохо начать документировать и передавать некоторую техническую информацию о системе взносов.В настоящее время это немного сложная система, и к ней нужно привыкнуть. В какой-то момент мы, вероятно, найдем постоянное и легкодоступное место для этой информации, но пока мы думаем, что разместить ее на форуме лучше, чем не делиться ею. В этом посте мы рассмотрим файлы «XML», файл «rules.conf» и то, как они связаны с созданием потерь и производным. Этап 1: когда вы импортируете новую запись, вы начинаете с заполнения «формы импорта», чтобы описать концерт. В этой форме вы получите возможность запретить деривативы с убытками. Мы называем их производными, потому что исходные файлы FLAC или SHN без потерь используются для «получения» файлов Ogg и MP3, которые вы видите на многих записях. Двигатель, который выполняет эту работу, удачно назван «производным». Опция разрешения/запрета потерь представлена ​​в нижней части экрана импорта, как показано на прикрепленном изображении1.jpg. Иногда вы можете заметить, что эта опция была отключена из-за просьбы художника о том, чтобы файлы с потерями *никогда* не создавались. (см. image2.jpg) Когда вы отправите эту первую форму, она создаст 2 файла из предоставленной вами информации: 1. [itemID]_meta.xml (обязателен для продолжения обработки элемента) 2 .[itemID]_rules.conf (необязательно для продолжения обработки элемента — создается только в том случае, если лицо, загружающее запись, или исполнитель отказались от файлов с потерями), где [itemID] = имя элемента папку, которую вы использовали для импортируемой записи. Файл [itemID]_meta.xml содержит всю информацию, которую вы отправляете в форму, включая источник, родословную, запись, передачу, сет-листы и т. д. Эта информация используется для «раскрашивания» страницы сведений, которую другие посетители будут просматривать в будущее. Файл [itemID>_rules.conf будет создан только в том случае, если вы откажетесь от форматов с потерями. Это делается путем установки флажка, который мы обсуждали выше. Содержимое этого файла представляет собой текстовую строку «CAT.lossy», которая указывает производному устройству не создавать файлы с потерями, а создавать только полный ZIP-файл шоу. Этап 2: После отправки вышеупомянутой формы появляется форма под названием «Параметры файла», в которой вы описываете все файлы, которые вы предоставили. -- Является ли файл файлом FLAC или SHN? Это качество CD или 24-битный звук? Файл текстовый? Если это музыкальный файл, укажите название песни и имя исполнителя. Если файл представляет собой текстовую информацию, то в поле «Создатель» следует указать автора — обычно имя тейпера. Если файл является музыкальным, поле «Создатель» должно автоматически заполняться именем исполнителя в записи. Отправьте эту информацию, когда вы подтвердите, что вся она точна, насколько вам известно. См. image3.jpg для копии этой формы. Эта информация создает еще один файл XML: 1. [itemID]_files.xml (обязателен для продолжения обработки элемента). Если вы разрешили создавать файлы с потерями, информация, введенная вами в эту форму, будет используется для записи идентификационных тегов в файлы с потерями. Это означает, что медиаплееры, такие как iTunes, WinAmp, Windows Media Player и т. д., будут автоматически отображать имя исполнителя, информацию об альбоме и названия песен при воспроизведении файлов. Тем не менее, это одноразовая сделка — если вы введете информацию здесь неправильно, ее обновление после создания файлов с потерями не приведет к обновлению тегов в этих файлах. Неправильные теги останутся до тех пор, пока производные не будут перегенерированы, поэтому очень важно сделать это правильно с первого раза. Этап 3: Как только система заметит, что существуют оба обязательных файла — [itemID]_files.xml и [itemID]_meta.xml — (она проверяет их примерно раз в 10 минут), она переместится элемент на следующую стадию процесса — производную. Файлы будут скопированы на "рабочий" компьютер, который выполнит следующие действия: - убедитесь, что оба обязательных файла метаданных существуют и что информация верна (без недопустимых символов) - проверьте целостность аудиофайла (запустите включенные файлы MD5, проверки FLAC ) - проверить наличие [itemID]_rules.conf - создать файлы с потерями, если [itemID]_rules.conf не найден. - пометить файлы с потерями - скопировать все готовые файлы обратно на сервер загрузки - изменить статус на "Ожидание одобрения куратором".
Это сообщение было изменено Брэдом Лебланом 14 января 2006 г., 09:04:51

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

Я новичок и не понимаю, как передать XML-файл в iTunes, чтобы иметь информацию ID3 для файлов с потерями, которые я загружаю и добавляю в iTunes. Я пробовал "Файл" -> "Импорт" и выбрал XML-файл, но, похоже, это не помогает. Спасибо.

Шаг 3. Пометка файлов с потерями не работает. Я загрузил файлы в формате .wav, и файлы mp3, сгенерированные дериватором, НЕ помечаются тегами с информацией о названии и исполнителе.

Здравствуйте!
У меня вопрос:

Можно ли отредактировать метаданные XML-файла и загрузить его через FTP?

Потому что я хотел бы изменить название песен в проигрывателе, и я понял, что названия песен берутся из XML-файла.

Поскольку около миллиарда человек используют Microsoft Office, формат DOCX является де-факто самым популярным стандартом для обмена файлами документов между офисами. Хотя DOCX является сложным форматом, вы можете проанализировать его вручную для более простых задач, таких как индексация, преобразование в TXT и внесение других небольших изменений. Я хотел бы предоставить вам достаточно информации о внутреннем устройстве DOCX, чтобы вам не пришлось обращаться к спецификациям ECMA — объемному руководству на 5000 страниц.

Поскольку около миллиарда человек используют Microsoft Office, формат DOCX является де-факто самым популярным стандартом для обмена файлами документов между офисами. Его ближайший конкурент — формат ODT — поддерживается только Open/LibreOffice и некоторыми продуктами с открытым исходным кодом, что делает его далеким от стандарта. Формат PDF не является конкурентом, потому что PDF-файлы нельзя редактировать и они не содержат полной структуры документа, поэтому они могут вносить только ограниченные локальные изменения, такие как водяные знаки, подписи и т.п. Вот почему большинство деловых документов создаются в формате DOCX; нет хорошей альтернативы для его замены.

Несмотря на то, что DOCX – сложный формат, вам может потребоваться проанализировать его вручную для более простых задач, таких как индексирование, преобразование в TXT и внесение других небольших изменений. Я хотел бы предоставить вам достаточно информации о внутреннем устройстве DOCX, чтобы вам не пришлось обращаться к спецификациям ECMA — объемному руководству на 5000 страниц.

Лучший способ понять формат — создать простой документ из одного слова в MSWord и посмотреть, как редактирование документа меняет лежащий в его основе XML. Вы столкнетесь с некоторыми случаями, когда DOCX неправильно форматируется в MS Word, и вы не знаете, почему, или столкнетесь со случаями, когда неясно, как создать желаемое форматирование. В этом поможет видение и понимание того, что происходит в XML.

Около года я работал над редактором DOCX для совместной работы CollabOffice и хочу поделиться своими знаниями с сообществом разработчиков. В этой статье я объясню файловую структуру DOCX, обобщив информацию, разбросанную по Интернету. Эта статья является промежуточным звеном между огромной и сложной спецификацией ECMA и простыми онлайн-руководствами, доступными в настоящее время. Вы можете найти файлы, сопровождающие эту статью, в проекте toptal-docx в моей учетной записи github.

Простой файл DOCX

Несмотря на то, что мы создали простой документ, в процессе сохранения в Microsoft Word были созданы темы по умолчанию, свойства документа, таблицы шрифтов и т. д. в формате XML.

Для начала давайте удалим неиспользуемые элементы и сосредоточимся на document.xml, который содержит основные текстовые элементы. Когда вы удаляете файл, убедитесь, что вы удалили все ссылки на него из других файлов xml. Вот пример сравнения кода, показывающий, как я удалил зависимости от app.xml и core.xml. Если у вас есть какие-либо неразрешенные/отсутствующие ссылки, MSWord будет считать файл поврежденным.

Вот структура нашего упрощенного минимального документа DOCX (а вот и проект на github):

Давайте разберем по файлам отсюда, сверху:

_rels/.rels

Определяет ссылку, которая сообщает MS Word, где искать содержимое документа. В данном случае это ссылка на word/document.xml :

_rels/document.xml.rels

Этот файл определяет ссылки на ресурсы, такие как изображения, встроенные в содержимое документа. В нашем простом документе нет встроенных ресурсов, поэтому тег отношения пуст:

[Content_Types].xml

[Content_Types].xml содержит информацию о типах мультимедиа внутри документа. Поскольку у нас есть только текстовый контент, это довольно просто:

документ.xml

Наконец, вот основной XML с текстовым содержимым документа. Я удалил некоторые объявления пространств имен для ясности, но вы можете найти полную версию файла в проекте github. В этом файле вы обнаружите, что некоторые ссылки на пространство имен в документе не используются, но вам не следует их удалять, поскольку они нужны MS Word.

Вот наш упрощенный пример:

Основной узел представляет собой сам документ, содержит абзацы и вложенные в него размеры страницы, определенные с помощью .

это атрибут, который можно игнорировать; он используется внутренними компонентами MS Word.

Давайте рассмотрим более сложный документ с тремя абзацами. Я выделил XML теми же цветами на снимке экрана из Microsoft Word, чтобы вы могли видеть взаимосвязь:

Структура абзаца

Простой документ состоит из абзацев, абзац состоит из строк (серии текста с одинаковым шрифтом, цветом и т. д.), а строки состоят из символов (например, ). внутри тегов может быть несколько символов, и их может быть несколько в одном прогоне.

Опять же, мы можем игнорировать .

Свойства текста

Основные свойства текста — это шрифт, размер, цвет, стиль и т. д. Существует около 40 тегов, определяющих внешний вид текста. Как вы можете видеть в нашем примере с тремя абзацами, у каждого прогона есть свои собственные свойства внутри , спецификация и жирность .

Важно отметить, что свойства делают различие между двумя группами символов, обычным и сложным письмом (например, арабским), и что свойства имеют разные теги в зависимости от того, на какой тип символов они воздействуют.< /p>

Большинство тегов свойств обычных скриптов имеют соответствующий тег сложного скрипта с добавленной буквой «C», указывающей, что свойство предназначено для сложных скриптов. Например: (курсив) становится , а полужирный тег для обычного письма становится для сложного письма.

Стили

В Microsoft Word есть целая панель инструментов, посвященная стилям: обычный, без интервала, заголовок 1, заголовок 2, заголовок и т. д. Эти стили хранятся в файле /word/styles.xml (примечание: на первом этапе нашего простого примера мы удалили этот XML из DOCX. Чтобы увидеть это, создайте новый DOCX).

После того как вы определили текст как стиль, вы найдете ссылку на этот стиль внутри тега свойств абзаца, . Вот пример, где я определил свой текст со стилем Заголовок 1:

а вот и сам стиль из styles.xml:

Xpath указывает, что шрифт выделен полужирным, и указывает цвет шрифта. указывает MSWord использовать стиль «Обычный» для любых отсутствующих свойств.

Наследование собственности

Свойства текста наследуются. Прогон имеет свои собственные свойства ( w:p/w:r/w:rPr/* ), но он также наследует свойства абзаца ( w:r/w:pPr/* ), и оба могут ссылаться на свойства стиля из / слово/стили.xml .

Абзацы и прогоны начинаются со свойствами по умолчанию: w:styles/w:docDefaults/w:rPrDefault/* и w:styles/w:docDefaults/w:pPrDefault/* . Чтобы получить конечный результат свойств персонажа, вы должны:

  1. Использовать свойства запуска/абзаца по умолчанию
  2. Добавить свойства стиля прогона/абзаца
  3. Добавить локальные свойства запуска/абзаца
  4. Добавить свойства прогона результатов к свойствам абзаца.

Когда я говорю "присоединить" B к A, я имею в виду повторение всех свойств B и переопределение всех свойств A, оставляя все непересекающиеся свойства как есть.

Еще одно место, где могут быть расположены свойства по умолчанию, — это тег с w:type="paragraph" и w:default="1" . Обратите внимание, что сами символы внутри прогона никогда не имеют стиля по умолчанию, поэтому фактически не влияют на текст.

Переключить свойства

Некоторые свойства являются переключаемыми, например (жирный шрифт) или (курсив); эти атрибуты ведут себя как оператор XOR.

Это означает, что если родительский стиль выделен полужирным шрифтом, а дочерний шрифт выделен жирным шрифтом, результатом будет обычный нежирный текст.

Чтобы правильно обрабатывать атрибуты-переключатели, необходимо провести много тестов и перепроектировать. Взгляните на параграф 17.7.3 спецификации Open XML ECMA-376, чтобы получить формальные подробные правила для свойств переключения/

Шрифты

Шрифты подчиняются тем же общим правилам, что и другие текстовые атрибуты, но значения свойств шрифта по умолчанию указываются в отдельном файле темы, на который ссылаются в word/_rels/document.xml.rels следующим образом:

Исходя из приведенной выше ссылки, имя шрифта по умолчанию будет найдено в word/theme/themes1.xml внутри тега a:themeElements/a:fontScheme/a:majorFont или a:minorFont.

Размер шрифта по умолчанию — 10, если тег w:docDefaults/w:rPrDefault отсутствует, тогда размер шрифта — 11.

Выравнивание текста

Выравнивание текста задается тегом с четырьмя доступными режимами w:val: "слева", "по центру", "справа" и "оба".

«левый» — режим по умолчанию; текст начинается слева от прямоугольника абзаца (обычно на ширину страницы). (Этот абзац выровнен по левому краю, что является стандартным.)

Режим "center", как и ожидалось, центрирует все символы внутри ширины страницы. (Опять же, этот абзац иллюстрирует выравнивание по центру.)

В "правильном" режиме текст абзаца выравнивается по правому полю. (Обратите внимание, как этот текст выровнен по правому краю.)

Режим «оба» добавляет дополнительный интервал между словами, так что строки становятся шире и занимают всю ширину абзаца, за исключением последней строки, которая выравнивается по левому краю. (Этот абзац является демонстрацией этого.)

Изображения

DOCX поддерживает два типа изображений: встроенные и плавающие.

Встроенные изображения появляются внутри абзаца вместе с другими символами и используются вместо использования (текст). Идентификатор изображения можно найти с помощью следующего синтаксиса xpath:

Идентификатор изображения используется для поиска имени файла в файле word/_rels/document.xml.rels и должен указывать на файл gif/jpeg внутри подпапки word/media. (См. файл word/_rels/document.xml.rels проекта github, где вы можете увидеть идентификатор изображения.)

Плавающие изображения размещаются относительно абзацев, а текст обтекает их. (Вот пример документа проекта github с плавающим изображением.)

Плавающие изображения используются вместо , поэтому, если вы удаляете какой-либо текст внутри , будьте осторожны с якорями, если вы не хотите, чтобы изображения были удалены.

Таблицы

, сама таблица, имеет свойства таблицы, и каждое свойство столбца представлено внутри. Строки следуют одна за другой в виде тегов, и каждая строка должна иметь такое же количество столбцов, как указано в:

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

Единицы

Многие атрибуты XML внутри DOCX указывают размеры или расстояния. Хотя внутри XML они представляют собой целые числа, все они имеют разные единицы измерения, поэтому необходимо некоторое преобразование. Тема сложная, поэтому я бы порекомендовал эту статью Ларса Корнелиуссена о единицах измерения в файлах DOCX. Таблица, которую он представляет, полезна, хотя и с небольшой опечаткой: дюймы должны быть pt/72, а не pt*72.

Вот шпаргалка:

Советы по реализации макетировщика

Если вы хотите преобразовать файл DOCX (например, в PDF), нарисовать его на холсте или подсчитать количество страниц, вам придется реализовать компоновщик. Компоновщик — это алгоритм вычисления позиций символов в файле DOCX.

Это сложная задача, если вам требуется рендеринг со 100-процентной точностью. Количество времени, необходимое для реализации хорошего компоновщика, измеряется в человеко-годах, но если вам нужен только простой, ограниченный, это можно сделать относительно быстро.

Макетировщик заполняет родительский прямоугольник, который обычно представляет собой прямоугольник страницы. Он добавляет слова из прогона одно за другим. Когда текущая строка переполняется, она начинает новую. Если абзац слишком высок для родительского прямоугольника, он переносится на следующую страницу.

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

  • Компоновщик должен позаботиться о выравнивании текста и наведении текста на изображения.
  • Он должен поддерживать работу с вложенными объектами, такими как вложенные таблицы.
  • Если вы хотите обеспечить полную поддержку таких изображений, вам придется реализовать компоновщик как минимум с двумя проходами, первый шаг собирает позиции плавающих изображений, а второй заполняет пустое пространство текстовыми символами.
  • Обратите внимание на отступы и пробелы. У каждого абзаца есть интервалы до и после, и эти числа задаются тегом w:spacing. Вертикальный интервал определяется тегами w:after и w:before. Обратите внимание, что межстрочный интервал определяется w:line, но это не размер строки, как можно было бы ожидать. Чтобы получить размер строки, возьмите текущую высоту шрифта, умножьте на w:line и разделите на 12.
  • Файлы DOCX не содержат информации о нумерации страниц. Вы не найдете количество страниц в документе, если не подсчитаете, сколько места вам нужно для каждой строки, чтобы определить количество страниц. Если вам нужно найти точные координаты каждого символа на странице, обязательно учитывайте все пробелы, отступы и размеры.
  • Если вы реализуете полнофункциональный макетировщик DOCX, который обрабатывает таблицы, обратите внимание на особые случаи, когда таблицы занимают несколько страниц. Ячейка, вызывающая переполнение страницы, также влияет на другие ячейки.
  • Создание оптимального алгоритма для расчета ширины столбцов таблицы — сложная математическая задача, поэтому текстовые процессоры и программы компоновки обычно используют неоптимальные реализации. Предлагаю в качестве первого приближения использовать алгоритм из HTML-табличной документации W3C. Я не нашел описания алгоритма, используемого в MS Word, и Microsoft со временем доработала этот алгоритм, чтобы разные версии Word могли размещать таблицы немного по-разному.

Если что-то непонятно: реконструируйте XML!

Когда непонятно, как работает тот или иной XML-тег внутри MS Word, есть два основных подхода к выяснению этого:

Создавайте нужный контент шаг за шагом. Начните с простого файла docx. Сохраняйте каждый шаг в отдельный файл, например, 1.docx, 2.docx. Разархивируйте каждый из них и используйте инструмент визуального сравнения для сравнения папок, чтобы увидеть, какие теги появляются после ваших изменений. (Чтобы получить коммерческую версию, попробуйте Araxis Merge или бесплатную версию WinMerge.)

Если вы создаете файл DOCX, который не нравится MS Word, действуйте в обратном порядке. Шаг за шагом упрощайте XML. В какой-то момент вы узнаете, какое изменение MS Word считает неверным.

DOCX довольно сложен, не так ли?

Это сложно, и лицензия Microsoft запрещает использование MS Word на стороне сервера для обработки DOCX — это довольно стандартно для коммерческих продуктов. Однако Microsoft предоставила файл XSLT для обработки большинства тегов DOCX, но он не даст вам 100-процентной или даже 99-процентной точности. Такие процессы, как наложение текста на изображения, не поддерживаются, но вы сможете поддерживать большинство документов. (Если вам не нужна сложность, рассмотрите возможность использования Markdown в качестве альтернативы.)

Если у вас есть достаточный бюджет (бесплатного механизма рендеринга DOCX нет), вы можете использовать коммерческие продукты, такие как Aspose или docx4j. Самым популярным бесплатным решением является LibreOffice для преобразования между DOCX и другими форматами, включая PDF. К сожалению, LibreOffice содержит много мелких ошибок во время преобразования, и, поскольку это сложный продукт C++ с открытым исходным кодом, проблемы с точностью устраняются медленно и сложно.

В качестве альтернативы, если макет DOCX кажется вам слишком сложным для самостоятельной реализации, вы также можете преобразовать его в HTML и использовать для отображения в браузере. Вы также можете обратиться к одному из внештатных XML-разработчиков Toptal.

Повесть о двух форматах: использование небезопасных парсеров файлов XML и ZIP для создания веб-оболочки

XML и ZIP — история стара как мир

Исследуя цель вознаграждения за обнаружение ошибок, я наткнулся на веб-приложение, которое обрабатывало файл нестандартного типа. Назовем его .xyz . Быстрый поиск в Google показал, что тип файла .xyz на самом деле представляет собой просто ZIP-файл, который содержит XML-файл и дополнительные мультимедийные ресурсы. Файл XML функционирует как манифест для описания содержимого пакета.

Это чрезвычайно распространенный способ упаковки пользовательских типов файлов. Например, если вы попытаетесь разархивировать файл Microsoft Word с помощью unzip Document.docx , вы получите:

Другим хорошо известным примером этого шаблона является файл приложения Android .apk, который по сути представляет собой ZIP-файл, содержащий файл манифеста AndroidManifest.xml и другие ресурсы.

Однако при наивном подходе этот шаблон упаковки создает дополнительные проблемы с безопасностью. Эти «уязвимости» на самом деле являются функциями, встроенными в форматы XML и ZIP. Ответственность за безопасное обращение с этими функциями ложится на парсеры XML и ZIP. К сожалению, такое случается редко, особенно когда разработчики просто используют настройки по умолчанию.

Вот краткий обзор этих «уязвимых функций».

Внешние объекты XML

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

Как говорится в вики OWASP Foundation:

Эта атака происходит, когда входные данные XML, содержащие ссылку на внешний объект, обрабатываются слабо сконфигурированным парсером XML. Java-приложения, использующие XML-библиотеки, особенно уязвимы для XXE, потому что настройки по умолчанию для большинства XML-парсеров Java включают XXE. Чтобы безопасно использовать эти синтаксические анализаторы, вы должны явно отключить XXE в используемом синтаксическом анализаторе.

Как и в моем предыдущем отчете об удаленном выполнении кода, разработчики подвергаются риску из-за уязвимых настроек по умолчанию.

Обход ZIP-каталога

Хотя обход каталогов ZIP использовался с момента создания формата, этот вектор атаки получил известность в 2018 году благодаря исследовательской/маркетинговой кампании Snyk с неуклюжим названием Zip Slip, которая обнаружила уязвимость во многих популярных библиотеках парсеров ZIP.

Злоумышленник может воспользоваться этой уязвимостью с помощью ZIP-файла, содержащего имена файлов обхода каталога, например ../../../../evil1/evil2/evil.sh . Когда уязвимая ZIP-библиотека пытается разархивировать этот файл, вместо того, чтобы разархивировать evil.sh во временный каталог, она распаковывает его в другое место в файловой системе, определенное злоумышленником (в данном случае /evil1/evil2). Это может легко привести к удаленному выполнению кода, если злоумышленник перезапишет сценарий задания cron или создаст веб-оболочку в корневом веб-каталоге.

Подобно XXE, обход каталога ZIP особенно распространен в Java:

Открытие XXE

Теперь, когда у нас есть теоретические основы атаки, давайте перейдем к реальной уязвимости на практике. Приложение принимало загрузки файлов пользовательского типа, распаковывало их, анализировало XML-файл манифеста и возвращало страницу подтверждения с подробностями манифеста. Например, если mypackage.xyz представляет собой ZIP-файл, содержащий следующий файл manifest.xml:

Я получу следующий экран подтверждения:

Первое, что я сделал, это протестировал XSS.Один из советов по внедрению XSS через XML заключается в том, что XML не поддерживает raw, потому что он интерпретируется как узел XML, поэтому вам нужно экранировать их в XML, например <htmltags> . К сожалению, выходные данные были обработаны должным образом.

Следующим шагом была проверка на XXE. Здесь я допустил ошибку и начал с тестирования удаленного внешнего объекта:

Я не получил ответа на свой экземпляр Burp Collaborator и сразу предположил, что XXE заблокированы. Это ошибка, потому что вы всегда должны проводить инкрементальное тестирование, начиная с несистемных внешних сущностей, продвигаясь к локальным файлам, а затем к удаленным файлам. Это поможет вам устранить различные возможности на этом пути. В конце концов, стандартное правило брандмауэра блокирует исходящие веб-соединения, что приводит к сбою удаленного внешнего объекта. Однако это не обязательно означает, что локальные внешние объекты заблокированы.

К счастью, я решил повторить попытку позже с локальным внешним объектом:

Именно тогда я наткнулся на золото. Содержимое /etc/hosts появилось на странице подтверждения.

Переход к RCE

Обычно в сценарии белого хакерского взлома вы придерживаетесь неразрушающего доказательства концепции и останавливаетесь на этом. С помощью XXE я мог открывать файлы локальной базы данных и несколько интересных веб-журналов, которые включали учетные данные администратора. Этого было достаточно, чтобы написать отчет.

Однако я хотел проверить еще одну уязвимость: синтаксический анализатор ZIP. Помните, что приложение разархивировало пакет, прочитало файл manifest.xml и вернуло страницу подтверждения. Я обнаружил XXE на втором этапе, предполагая, что в остальной части потока могут быть дополнительные уязвимости.

Чтобы протестировать обход каталога ZIP, я использовал evilarc, простой скрипт Python 2 для создания ZIP-файлов с полезной нагрузкой обхода каталога. Мне нужно было выяснить, где я хочу разместить полезную нагрузку обхода в локальной файловой системе. Здесь помог ХХЕ. Локальные внешние объекты поддерживают не только файлы, но и каталоги, поэтому, если бы я использовал внешний объект, такой как file:///nameofdirectory , вместо содержимого файла, он отображал бы содержимое каталога.

Распространенная поговорка гласит:

Определение безумия - это делать одно и то же снова и снова и ожидать другого результата.

Соглашение важнее конфигурации

Из статьи вы могли заметить, что я имел дело с Java-приложением. Это возвращает нас к предупреждениям OWASP и Snyk о том, что Java исключительно склонна к неправильной обработке файлов XML и ZIP. Из-за сочетания небезопасных значений по умолчанию и отсутствия парсеров по умолчанию разработчики вынуждены полагаться на случайные фрагменты кода Stack Overflow или сторонние библиотеки.

Однако Java не единственный виновник. Неправильное обращение с файлами XML и ZIP происходит во всех языках программирования и во всех средах. Ожидается, что разработчики приложат все усилия для безопасной настройки сторонних библиотек и API, что упрощает введение уязвимостей в приложение. Разработчику достаточно сделать одну ошибку, чтобы создать уязвимость в своем приложении. Вероятность этого увеличивается с каждой дополнительной библиотекой «черных ящиков».

Одним из подходов к уменьшению уязвимостей в процессе разработки является «Золотой путь» Spotify:

В Spotify одной из наших инженерных стратегий является создание и продвижение использования «Золотых путей». Golden Paths — это благословенный способ создавать продукты в Spotify. Они состоят из набора API, платформ приложений, лучших практик и сред выполнения, которые позволяют инженерам Spotify безопасно, надежно и в масштабе разрабатывать и развертывать код. Мы дополняем их дополнительными программами, которые помогают повысить качество. Из наших отчетов об ошибках мы обнаружили, что чем больше разработка придерживается Золотого пути, тем меньше вероятность того, что нам сообщат об уязвимости.

Это сводится к простому правилу Ruby on Rails: «Конвенция превыше конфигурации».

Вместо того, чтобы полагаться на то, что тысячи инженеров по отдельности запомнят все тонкости безопасности веб-приложений, гораздо эффективнее сосредоточиться на проверенном наборе фреймворков и API и уменьшить необходимость постоянной настройки этих параметров.< /p>

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

Огромная благодарность группе безопасности, стоящей за программой Bug Bounty, которая устранила уязвимость менее чем за 12 часов и дала добро на публикацию этой статьи.

Читайте также:

ОБЫЧНЫЕ ПРЕОБРАЗОВАТЕЛИ ЕДИНИЦ DOCX XML
20-я точка Точки
dxa/20
Дюймы
pt/72
Сантиметры
in*2,54
Половинный размер шрифта
pt/144
EMU
in*914400
Пример 11906 595,3 8,27… 21,00086… 4,135 7562088
Теги, использующие это pgSz/pgMar/w:spacing w:sz wp:extent, a:ext