Введение

Компьютерная программа или файл, допустимый в нескольких языках программирования или форматах файлов. В информатике полиглотом называется компьютерная программа или скрипт (или другой файл), написанный в допустимом формате нескольких языков программирования или форматов файлов. Название было придумано по аналогии с многоязычием. Файл-полиглот создается путем объединения синтаксиса двух или более различных форматов. Если форматы файлов предназначены для компиляции или интерпретации как исходный код, файл можно назвать полиглотной программой, хотя форматы файлов и синтаксис исходного кода по сути являются потоками байтов, и использование этого общего принципа является ключевым в разработке полиглотов. Файлы-полиглоты имеют практическое применение в обеспечении совместимости, но также могут представлять угрозу безопасности при использовании для обхода проверки или эксплуатации уязвимости.

История

Программы-полиглоты создавались как задачи и объекты для экспериментов в хакерской культуре, по крайней мере, с начала 1990-х годов. Заметный ранний пример, просто названный "полиглот", был опубликован в группе Usenet rec.puzzles в 1991 году, поддерживая 8 языков, хотя вдохновение для него были еще более ранние программы. В 2000 году программа-полиглот стала победителем Международного конкурса запутанного кода на C. В XXI веке программы и файлы-полиглоты привлекли внимание как механизм скрытого канала для распространения вредоносного ПО. Такие документы могут быть разобраны как HTML (который совместим с SGML), так и XML, и в обоих случаях создадут одну и ту же структуру DOM. Например, чтобы документ HTML5 соответствовал этим критериям, необходимо, чтобы он имел doctype HTML5 и был написан на корректном XHTML. Тот же документ затем может быть представлен как HTML или XHTML, в зависимости от поддержки браузера и типа MIME. Как указано в рекомендации по HTML-полиглотам, например, для добавления пустого текстового поля на страницу нельзя использовать `<textarea/>`, а необходимо использовать `<textarea></textarea>`.

Форматы композиции

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

Совместимость

Языки программирования Python 2 и Python 3 не разрабатывались с учетом совместимости друг с другом, однако синтаксис в них достаточно схож, что позволяет написать программу на Python, которая будет работать в обеих версиях.

Атака GIFAR

Graphics Interchange Format Java Archives (GIFAR) — это полиглотический файл, который одновременно является файлом формата GIF и JAR. Этот метод может быть использован для эксплуатации уязвимостей безопасности, например, путем загрузки GIFAR на веб-сайт, допускающий загрузку изображений (поскольку это валидный GIF-файл), и последующего выполнения Java-части GIFAR, как будто она является частью кода веб-сайта, доставляемого браузеру из того же домена. Уязвимость в Java была устранена в JRE 6 Update 11, CVE было опубликовано в декабре 2008 года. Возможность создания GIFAR обусловлена тем, что изображения GIF хранят свой заголовок в начале файла, а файлы JAR (как и любой формат, основанный на архиве ZIP) — свои данные в конце файла.

Связанная терминология

Полиглотное программирование — это практика создания систем с использованием нескольких языков программирования, не обязательно в одном файле. Полиглотная постоянная работа с данными — аналогичный подход, но применительно к базам данных.