Файлы и люди
Файлы и люди
На сервисе лежат файлы, которые прислали люди: фотографии отзывов, видео обзоров. Всё, что ниже, написано ради этого, а не ради формальности.
Что происходит с файлом на приёме
- Тип определяется разбором — по содержимому, а не по расширению и не по словам клиента. Расширение выходного файла назначаем мы.
- Антивирус. Если он недоступен, приём отказывает
503, а не пропускает файл: молчаливый пропуск при недоступной проверке — это ложь о проделанной работе. - Перекодирование. Картинка никогда не отдаётся такой, какой пришла.
- Метаданные снимаются. EXIF и GPS не переживают перекодирования.
Координаты дома человека в метаданных фотографии отзыва — это утечка, которую никто не заметит. Она не вызовет ошибки, не попадёт в журнал и не сломает страницу. Именно поэтому снятие метаданных встроено в путь, а не оставлено на усмотрение того, кто загружает.
SVG не принимается и не отдаётся
Никогда, ни на входе, ни на выходе. SVG — это исполняемая разметка, а не картинка: внутри неё живёт скрипт, который выполнится в браузере читателя от имени вашего домена. Проверка идёт дважды — по типу содержимого и по началу файла, потому что на SVG определитель типа нередко говорит «текст».
Отдаются только: image/webp, image/jpeg,
image/png, video/mp4, плейлист HLS и его сегменты.
Всё прочее — отказ 415.
Заголовки отдачи
На хосте отдачи нет ни сессий, ни JavaScript, ни единой
Set-Cookie. Файлы отдаёт веб-сервер прямо с диска — исполняемого
кода на этом пути нет вовсе. Содержимое отдаётся с
Content-Security-Policy: default-src 'none'; sandbox и
X-Content-Type-Options: nosniff: даже если бы что-то опасное туда
попало, браузер не стал бы это исполнять.
Как стереть обычные загрузки человека
У каждого объекта есть owner_ref — то, чем вы называете
владельца файла. Для обычных изображений каталога он пуст: они не про
человека. Для фотографий отзывов и видеообходов он обязателен. Материалы
стока могут быть связаны с автором и подчиняются правилу хранения ниже.
POST /api/v1/erase?owner_ref=user-8123
→ { "ok": true, "erased_objects": 14, "files_removed": 31 }
Ответ называет число, и это главное в нём. Ваша приёмка по
персональным данным должна сверять исполнение, а не намерение: строка,
помеченная удалённой, но лежащая на диске, — это невыполненное удаление.
Поэтому erase удаляет и записи, и байты, включая отложенные копии
предыдущих версий, и делает это сразу, а не по расписанию.
Если с этим owner_ref связан хотя бы один материал стока, включая снятый с витрины, erase отвечает 409 asset_in_stock и ничего не удаляет. Оригинал нужен для уже выданных лицензий. Используйте разные owner_ref для стока и обычных загрузок; закрытие аккаунта требует отдельной проверки.
Журналы
Журнал отдачи с адресами читателей поворачивается каждые сутки и хранится в одной копии: дольше двух суток адрес на машине не лежит. Дольше он нам не нужен ни для чего, а значит хранить его дольше было бы просто накоплением чужих следов.
Ключи подписи
У арендатора всегда два действующих ключа — иначе смена ключа была бы простоем. Секрет показывается один раз при выдаче и не отдаётся в панель управления: возможность подписать запрос — это право писать в чужое хранилище.