Файлы и люди — keepix.cloud Перейти к содержимому

Файлы и люди

Файлы и люди

На сервисе лежат файлы, которые прислали люди: фотографии отзывов, видео обзоров. Всё, что ниже, написано ради этого, а не ради формальности.

Что происходит с файлом на приёме

  1. Тип определяется разбором — по содержимому, а не по расширению и не по словам клиента. Расширение выходного файла назначаем мы.
  2. Антивирус. Если он недоступен, приём отказывает 503, а не пропускает файл: молчаливый пропуск при недоступной проверке — это ложь о проделанной работе.
  3. Перекодирование. Картинка никогда не отдаётся такой, какой пришла.
  4. Метаданные снимаются. 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 для стока и обычных загрузок; закрытие аккаунта требует отдельной проверки.

Журналы

Журнал отдачи с адресами читателей поворачивается каждые сутки и хранится в одной копии: дольше двух суток адрес на машине не лежит. Дольше он нам не нужен ни для чего, а значит хранить его дольше было бы просто накоплением чужих следов.

Ключи подписи

У арендатора всегда два действующих ключа — иначе смена ключа была бы простоем. Секрет показывается один раз при выдаче и не отдаётся в панель управления: возможность подписать запрос — это право писать в чужое хранилище.