Перейти к содержимому

2. Получение файлов и манифест ​

Суть этапа ​

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

Получение в 0.1.0 и расширение в 0.2.0 ​

СпособКак получаем архивНеобходимые права
Прямое чтениеСкачиваем файлы через FTP/SFTP/FTPS и собираем архив у насЧтение согласованного корня
Временный PHP-сборщикЗагружаем наш файл, запускаем по HTTPS, он собирает снимок на хостингеЧтение файлов и отдельное разрешение на установку/удаление сборщика и временных данных

В 0.1.0 реализуем только прямое чтение. Сборщик — кандидат для 0.2.0, дополнительный способ для совместимого хостинга; его пока нет в коде. Оба пути возвращают один формат снимка и манифеста, затем переходят к карантину S3.

Прямое чтение ​

  1. Обходим доступное дерево внутри разрешённого корня.
  2. Скачиваем файлы с ограничениями времени, размера и общего объёма.
  3. Вычисляем хеши полученных байтов и создаём манифест.
  4. Формируем архив на нашей стороне.

Обычный FTP не даёт универсальной команды создания ZIP на сервере. Серверная архивация возможна только при наличии отдельного механизма, например SSH, API хостинга или описанного ниже PHP-сборщика. Спецификация FTP.

Временный PHP-сборщик: кандидат для 0.2.0 ​

Для совместимого хостинга можно загрузить наш PHP-файл через FTP и запустить его отдельным авторизованным HTTPS-запросом. FTP сам по себе код не исполняет. Сборщик получает только согласованный корень и возвращает тот же снимок с манифестом. WordPress/OpenCart для этого не запускаем.

Порядок: разрешение на установку → проверка совместимости → загрузка → сбор и передача → проверка целостности → удаление и проверка очистки.

Обязательные условия:

  • Проверить HTTPS, соответствие папки URL, права, свободное место, PHP и архиватор. Для ZIP подходит ZipArchive, если расширение доступно.
  • Только фиксированные операции. Никаких произвольных команд, PHP-кода, путей или адресов назначения из запроса.
  • Авторизация на одну задачу, срок действия и защита от повторного запуска. Случайное имя файла не заменяет авторизацию; секрет не передаётся в URL.
  • Ограничения времени, памяти, объёма и нагрузки; для больших сайтов — сбор частями. Ссылки, сам сборщик и его временные данные исключаются из снимка.
  • Архив недоступен по публичному URL: закрытая область вне web-root и защищённая передача либо ограниченная загрузка в назначенный объект S3. Постоянных ключей S3 на хостинге нет.
  • После подтверждения получения удалить только файлы своей задачи. Самоудаления недостаточно: исполнитель повторяет очистку через файловое подключение и проверяет её. «Снимок получен» и «временные файлы удалены» — разные статусы.

Если защищённая передача и очистка невозможны, используем прямое чтение. На заражённом хостинге результат может быть подменён. Права PHP и FTP могут различаться; хеши не доказывают полноту или атомарность снимка и не добавляют бекап БД.

PHP ZipArchive · Ограничения PHP

Что входит в манифест ​

ПолеДля чего
Путь, размер и доступные метаданныеИнвентаризация полученных файлов
Хеш содержимогоПроверка целостности и сравнение версий
Статус полученияПолучен, пропущен, недоступен или изменился при чтении
Причина пропускаОграничение, ссылка, ошибка доступа или неподдерживаемый объект
Время начала и конца сбораПонимание свежести снимка

Включаем код, конфиги, изображения и загрузки. «Активные файлы» нельзя надёжно определить по FTP, а расширение изображения не означает безопасность. За пределы корня и по символическим ссылкам не переходим. База данных, процессы и настройки вне доступной папки не входят в покрытие файловой проверки.

Результат этапа ​

Архив и манифест отражают фактически полученное содержимое. Неполный сбор не становится полной проверкой. Работающий сайт может изменяться при скачивании: это не атомарный снимок и не полный бекап с базой данных.

Securify · Документация проекта · Прототип → MVP