Файли й люди
Файли й люди
На сервісі лежать файли, які надіслали люди: світлини відгуків, відео оглядів. Усе, що нижче, написано заради цього, а не заради формальності.
Що відбувається з файлом на прийманні
- Тип визначається розбором — за вмістом, а не за розширенням і не за словами клієнта. Розширення вихідного файлу призначаємо ми.
- Антивірус. Якщо він недоступний, приймання відмовляє
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 для стоку і звичайних завантажень; закриття облікового запису потребує окремої перевірки.
Журнали
Журнал віддачі з адресами читачів обертається щодоби і зберігається в одній копії: довше двох діб адреса на машині не лежить. Довше він нам не потрібен ні для чого, а отже зберігати його довше було б просто накопиченням чужих слідів.
Ключі підпису
В орендаря завжди два діючі ключі — інакше зміна ключа була б простоєм. Секрет показується один раз при видачі і не віддається до панелі керування: можливість підписати запит — це право писати в чуже сховище.