2. Получение файлов и манифест
Суть этапа
Исполнитель получает файлы сайта и описывает, какие данные действительно удалось собрать. Содержимое сайта пока не запускается и не передаётся целиком агенту.
Получение в 0.1.0 и расширение в 0.2.0
| Способ | Как получаем архив | Необходимые права |
|---|---|---|
| Прямое чтение | Скачиваем файлы через FTP/SFTP/FTPS и собираем архив у нас | Чтение согласованного корня |
| Временный PHP-сборщик | Загружаем наш файл, запускаем по HTTPS, он собирает снимок на хостинге | Чтение файлов и отдельное разрешение на установку/удаление сборщика и временных данных |
В 0.1.0 реализуем только прямое чтение. Сборщик — кандидат для 0.2.0, дополнительный способ для совместимого хостинга; его пока нет в коде. Оба пути возвращают один формат снимка и манифеста, затем переходят к карантину S3.
Прямое чтение
- Обходим доступное дерево внутри разрешённого корня.
- Скачиваем файлы с ограничениями времени, размера и общего объёма.
- Вычисляем хеши полученных байтов и создаём манифест.
- Формируем архив на нашей стороне.
Обычный 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, а расширение изображения не означает безопасность. За пределы корня и по символическим ссылкам не переходим. База данных, процессы и настройки вне доступной папки не входят в покрытие файловой проверки.
Результат этапа
Архив и манифест отражают фактически полученное содержимое. Неполный сбор не становится полной проверкой. Работающий сайт может изменяться при скачивании: это не атомарный снимок и не полный бекап с базой данных.