Он спрятал целую веб-страницу в фавиконку. В треде нашлось три способа чище
Хак упаковывает HTML страницы в пиксели фавиконки, по три байта на пиксель, и рендерит её крошечным загрузчиком. Мило. Потом исследователь безопасности заметил, что загрузчик можно выкинуть вовсе через полиглот HTML/PNG, а кто-то вспомнил deCSS, спрятанный в фавиконке ещё в 2000-м.
Метод: кодируем байты в каналы RGB с 4-байтным заголовком длины. Страница в 208 байт уместилась в 71 пиксель, внутри картинки 9×9, заняв 87% ёмкости.
Что бьёт сильнее: в PNG уже есть текстовые чанки tEXt — встроенные именно для того, чтобы запихивать произвольный текст в обычную с виду картинку.
Хак, если точно
Пост Тима Веле I Stored a Website in a Favicon делает ровно то, что обещает: кодирует HTML страницы прямо в пиксельные данные PNG фавиконки, по три байта на пиксель в каналы R, G и B, с 4-байтным заголовком длины спереди, чтобы декодер знал, где кончается полезная нагрузка. Демо-HTML весил 208 байт; с заголовком — 212 байт, для них нужен 71 пиксель, что влезает в картинку 9×9 на 87% ёмкости. Маленький загрузчик-бутстрап забирает фавиконку, рисует её на canvas, читает пиксели, разбирает длину и рендерит HTML. Автор честно оговаривает: так хранится контент, а не целый сайт, и загрузчик всё ещё нужен.
Тред перебивает его тремя способами
Самый авторитетный ответ пришёл от человека, известного именно этим жанром файловых трюков, и он убрал тот самый загрузчик, который автор считал необходимым:
«Тебе всё ещё нужен крошечный бутстрап-загрузчик, чтобы декодировать картинку. Не-а, всё можно сделать в одном файле через полиглот html/png (а сейчас можно получить и лучшее сжатие на новых форматах вроде webp)». — David Buchanan, исследователь безопасности, известный полиглотами файловых форматов
Дальше пожали плечами те, кто знает стандарт: в PNG уже есть место под текст:
«В PNG есть чанки-комментарии tEXt, zTXt и iTXt. Можно иметь совершенно нормальную картинку, файл которой набит сколь угодно большим контентом». — комментатор о встроенных текстовых чанках PNG
Ещё более простой путь вообще обходил пиксели:
«Вместо возни с пикселями — почему не взять SVG-фавиконку, хранить разметку прямо в ней и оттуда же её извлекать?» — немецкий разработчик, предлагающий SVG-фавиконку
И историческое отрезвление: это сделали четверть века назад, причём с контрабандой:
«Ещё в 2000-м кто-то спрятал deCSS в фавиконке… Чтобы извлечь: dd bs=1 skip=2238 < favicon.ico». — комментатор, вспоминающий прецедент deCSS в фавиконке
Самое интересное — в комментариях
Пост — приятный микрохак, а тред читается лучше: маленький мастер-класс о том, сколькими способами файловый формат умеет проносить данные — от полиглотов, одновременно валидных как HTML и как PNG, до чанков-комментариев, сделанных под эту задачу, до SVG-разметки, которой декодирование вообще не нужно. Фавиконка с deCSS образца 2000-го — идеальная кода: люди прячут нагрузку в крошечных иконках столько, сколько существуют фавиконки. Новизна тут не в трюке, а в том, что кто-то вывел его с нуля и описал чисто настолько, чтобы созвать всех, кто уже знал версии постарше и поострее.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
Из Apple Vision Pro сделали X11-сервер, и тред поставил на то, что X11 переживёт visionOS
UHF X11 учит гарнитуру говорить на протоколе X из 1980-х: каждое приложение Xlib открывается отдельным плавающим пространственным окном — с опциональными строками развёртки CRT и свечением люминофора. Самый смешной комментарий оказался ещё и самым правдоподобным прогнозом о том, какая технология выживет.