До списку уроків
10 клас · Урок 8 з 16

Deepfake, згода на образ і захист ресурсів

виконано0%
Крок 1

Що робимо сьогодні

Минулого уроку ти згенерував трек і відеофрагмент і описав їх у media.json. Сьогодні дві лінії: чий образ і голос ти маєш право використати — і як твій сервер не стає чужим ресурсом.

Урок не про те, щоб налякати. Синтез медіа — звичайний інструмент, ти сам ним користувався минулого разу. Але працює він і в інший бік. Тому сьогодні ми складаємо робочі правила. Перше — що робити з дзвінком, який здається дзвінком від рідних. Друге — які файли поїдуть на сервер.

Головний висновок уроку простий і чесний: розпізнавати підробку на око — ненадійно. Ознаки, які надійно працювали на генераціях 2019 року, на моделях 2024-го вже не працюють. Обидві дати — на схемі в кроці 2. Тому основна робота — не «вдивлятися», а мати процедуру. Перевірити джерело. Передзвонити. Спитати кодове слово.

Після уроку ти вмієш

Слова deepfake, hotlink і сигнатура файлу поки нічого не означають. Дійдемо до кожного — після прикладу.

Що поїде на сервер

ФайлЩо в ньому
~/www/media/consent.md правила використання образу й голосу в твоєму проєкті плюс бланк згоди
~/www/media/trust-protocol.md протокол довіри родини: кодове слово і правило зворотного дзвінка
~/www/media/media.json той самий маніфест з уроку 7 — сьогодні в ньому осмислено заповнюється consent
~/www/media/.htaccess або ~/conf/media.conf конфіг захисту від hotlink для теки /media/
Тека зветься за темою, не за номером уроку Практика лежить у ~/www/media/ — тій самій теці, що й на уроці 7. Не шукай lesson-08: тема одна, уроки два. Самі .mp3 і .mp4 так і лишаються в тебе на комп'ютері в media-local/ — учитель дивиться їх очно.

Хід уроку

ЕтапХвЩо робиш
Що вміє синтез10факти без страшилок: заміна обличчя, клон голосу, оживлення фото
Сліпий тест15вісім карток, твоя точність проти результатів досліджень
Ознаки й чому вони зникають10шість зон обличчя — і чесна межа цього методу
Право на власне зображення15ЦК України 307 і 308, згода для шкільного проєкту
Голос і протокол довіри20ланцюг шахрайства і точка, де він рветься; конструктор пам'ятки
Ресурси як мішень15квота, чужий трафік, hotlink
Тип файлу і ліміт розміру15сигнатура проти розширення, код 413
Практика й автоперевірка20чотири файли по FTP, чеклист до зеленого
Крок 2

Що вміє синтез сьогодні

Спокійний перелік можливостей із датами й джерелами. Без «нас усіх обдурять» — просто те, що вже існує

Уяви маску, зроблену рівно за твоїм обличчям. Колись таку робив гример на кіностудії — кілька тижнів. Тепер її будує програма за десятком фото і накладає на чуже відео. Такий ролик і звуть deepfake.

Ти вже бачив це зсередини: минулого уроку ти написав промпт і отримав готовий трек. Технологія одна й та сама. Різниця лише в тому, чиє обличчя й чий голос беруть за вихідний матеріал.

Три речі, які вміє звичайний застосунок

ЩоЩо потрібно на входіДе межа
Заміна обличчя у відео кілька десятків фото людини — стільки є в будь-якому відкритому профілі складні ракурси, рука перед обличчям, різке світло збоку
Клонування голосу короткий зразок мовлення: VALL-E показала результат із 3 секунд, Voice Engine від OpenAI — з 15 рідкісна мова, сильний акцент, довгий монолог зі складною інтонацією
Оживлення фото одне фото анфас рухи голови вбік, промова довша за кілька секунд

Зверни увагу на середній рядок. Три секунди голосу — це одна фраза в сторіс. П'ятнадцять секунд — це будь-яке відео, де ти щось розповідаєш. Це не аргумент «нічого не викладай»: це аргумент за те, щоб мати домовленість на випадок дзвінка.

Шкала: як з роками падав поріг входу для підробки медіа Від 2014 року, коли для генерації обличчя потрібен був дослідницький кластер, до 2024 року, коли підроблене відео працює в реальному часі під час відеодзвінка. Шкала якісна: вона показує напрямок, а не одиниці виміру. 2014 2017 2019 2023 2024 Скільки треба матеріалу, часу й грошей, щоб зробити переконливу підробку GAN, обличчя-плями 64×64, дослідницький кластер перші face swap: години відео жертви + дні обчислень StyleGAN: фотореалістичне обличчя за секунди VALL-E: клон голосу з 3 секунд запису відеодзвінок із підробленими співрозмовниками, реальний час напрямок один: щороку потрібно менше вихідного матеріалу, менше часу і менше грошей
Шкала якісна: вертикаль показує напрямок, а не одиниці виміру. GAN — це Generative Adversarial Networks, «генеративні змагальні мережі». Дві мережі там учаться одна проти одної: перша малює обличчя, друга намагається впіймати підробку. StyleGAN — мережа такого ж типу від NVIDIA, яка вперше дала фотореалістичні обличчя. Дати й факти — у розділі «Джерела»: GAN — Goodfellow та ін., 2014; StyleGAN — NVIDIA, 2019; VALL-E — Microsoft, січень 2023; Voice Engine — OpenAI, березень 2024; відеодзвінок із підробленими співрозмовниками — справа компанії Arup, Гонконг, лютий 2024.
Чого синтез не вміє Він не знає, про що ви домовилися вдома минулого тижня. Не знає прізвиська твого кота. Не має доступу до номера, який записаний у твоїх контактах, і не може прийняти дзвінок замість справжньої людини. Саме на цьому й будується весь захист із другої половини уроку.
Питання

Однокласник каже: «Мій голос підробити неможливо, я ніде не викладаю довгих відео». У нього є один сторіс, де він 8 секунд вітається з підписниками. Що ти йому відповіси?

Крок 3

Сліпий тест: людина чи синтез

Вісім карток. Кожна — текстовий опис фото, аудіо або відео: самих файлів тут немає, бо медіа на сервер не заливаються. Вирішуй за описом

Правила чесні: у частині карток «ознаки підробки» є там, де підробки немає, і навпаки. Саме так виглядає реальний матеріал. Відповідай швидко, як відповідав би на телефонний дзвінок, і не пропускай карток — розбір з'являється відразу після вибору.

Вісім карток

Що цей тест насправді показує Навіть 8 із 8 тут нічого не доводять. Ти читав опис, у якому ознаки вже названі словами. У житті ніхто не підпише «на шиплячих чути металевий призвук»: ти почуєш просто голос у поганому зв'язку, поки хтось поспішає й тисне. Тест потрібен рівно для одного висновку — око й вухо не той інструмент, на який варто ставити гроші родини.
Питання

У дослідженні UCL (2023) люди правильно розпізнавали синтезоване мовлення приблизно в 73% випадків, а спеціальне тренування майже не покращувало результат. Який практичний висновок із цього числа?

Крок 4

Ознаки підробки — і чому їх недостатньо

Шість зон, куди дивляться першими. Знати їх корисно. Спиратися на них — ні

Коли синтезована картинка не сходиться, вона не сходиться в тих самих місцях. Це там, де модель домальовує стик двох шарів. Ось шість зон, де це видно найчастіше.

Шість зон обличчя, де найчастіше видно артефакти синтезу Схематичне обличчя з шістьма позначеними зонами: межа обличчя й волосся, вуха і сережки, очі й моргання, рот і зуби під час мовлення, шия та комір, а також предмети й руки, що перекривають обличчя. Внизу — попередження, що всі шість ознак слабшають із кожним поколінням моделей. 1 2 3 4 5 6 1 · межа обличчя й волосся розмиття, «мило», окремі волосини зникають 2 · вуха, сережки, окуляри несиметрична пара, дужка окулярів обривається 3 · очі: моргання й відблиски відблиск у двох очах різної форми або в різних місцях 4 · рот і зуби під час мовлення зуби як одна суцільна пляма, губи розходяться зі звуком 5 · шия й комір шов між обличчям і тілом, різний тон шкіри 6 · рука або предмет перед обличчям край долоні «з'їдає» щоку на кілька кадрів
Ці шість зон — те, куди дивиться і людина, і більшість автоматичних детекторів. Схема описує механізм, а не гарантію.

Те саме для звуку

А тепер чесно: ці ознаки зникають У 2018 році вийшла робота «In Ictu Oculi»: тодішні підробки майже не моргали, бо в навчальних наборах не було фото із заплющеними очима. Ознака була відмінна — і протрималася близько року. Досить було додати в навчання кадри із заплющеними очима. Так само пішли шість пальців, так само йде металевий призвук на шиплячих. Кожна ознака в цьому списку — тимчасова.

Тому правило уроку інше й воно не старіє: перевіряй джерело, а не картинку. Хто це надіслав, з якого акаунта, чи є цей матеріал ще десь, чи можна зателефонувати людині на відомий номер. Джерело перевіряється за хвилину; вдивляння не дає відповіді ніколи.

ПитанняСкільки часуНаскільки надійно
«Чи є артефакти на межі обличчя?»хвилини ненадійно й з кожним роком гірше
«Звідки цей файл узявся?»1 хв надійно: у пересланого відео немає першоджерела
«Що каже сама людина, якщо їй передзвонити?»1 хв надійно, якщо номер узято з контактів, а не з дзвінка
«Чи є на матеріалі мітка походження (C2PA)?»секунди корисно, коли мітка є; її відсутність нічого не доводить
Мітка походження замість пошуку ознак Індустрія рухається в бік того, щоб справжнє підписувалося, а не підробка викривалася. Стандарт C2PA («Content Credentials») вшиває в файл підписані дані про те, чим і коли він створений; Європейський акт про ШІ вимагатиме позначати згенерований контент машинозчитуваною міткою з 2 серпня 2026 року. Твій media.json з минулого уроку — та сама ідея, зроблена вручну.
Питання

Під час відеодзвінка губи співрозмовника відстають від звуку приблизно на пів секунди. А картинка час від часу розсипається квадратами. Який висновок правильний?

Крок 5

Право на власне зображення

Це не етика й не «домовленість по-дружньому». В Україні це стаття Цивільного кодексу, і вона стосується твого шкільного проєкту

Дві статті, які варто вміти переказати своїми словами. Формулювання в кодексі короткі, тому нижче ти читаєш їх майже дослівно.

СтаттяПро що вонаЩо це означає для тебе
ЦК 307 «Фізична особа може бути знята на фото-, кіно-, теле- чи відеоплівку лише за її згодою». Згода припускається, якщо зйомка ведеться відкрито на вулиці, на зборах, конференціях, мітингах та інших заходах публічного характеру. Момент зйомки. На шкільному концерті чи мітингу знімати загальний план можна. Знімати однокласника в коридорі впритул, коли він проти, — ні.
ЦК 308 Фотографія й інші твори, на яких зображено фізичну особу, можуть бути публічно показані, відтворені, розповсюджені лише за згодою цієї особи. Момент публікації. Це окрема згода. «Він же дозволив зняти» не означає «він дозволив викласти на сайт».
Дві згоди, а не одна Зняти й опублікувати — різні дії з різних статей. Класична шкільна ситуація: людина погодилась на зйомку в проєкті, а потім побачила себе на сторінці, доступній усьому інтернету. Стаття 307 дає їй право вимагати припинити публічний показ у тій частині, що стосується її особистого життя.

До синтезу це застосовується так само. Якщо ти згенерував відео, де говорить обличчя однокласника, — ти розповсюджуєш зображення особи, і потрібна її згода. Те, що обличчя намалював алгоритм, нічого не змінює: впізнають конкретну людину.

Згода для шкільного проєкту: чотири поля

Довгі юридичні бланки в класі не працюють. Робочий мінімум — чотири питання, на які згода має відповідати однозначно.

ПолеПоганоРобочий варіант
Хто«однокласники» ім'я і прізвище кожного, чиє обличчя або голос звучить; для неповнолітніх — підпис одного з батьків
На що саме«на використання матеріалів» «голос у 40-секундному аудіо для проєкту про шкільну їдальню; обличчя не використовується»
Де публікується«в інтернеті» «сторінка http://91.219.61.4/s/login/media/, відкрита для всіх; сам файл на сервер не заливається»
Як відкликатине вказано «написати мені або вчителю; матеріал прибирається зі сторінки того самого дня, запис у media.json міняється на consent: "withdrawn"»
Згода — до генерації, не після Питати треба перед тим, як зробити матеріал. Після — це вже не питання, а поставлення перед фактом: файл існує, його бачила половина класу, і відмовити стає незручно.
Питання

Ти зняв однокласницю на відео на перерві — вона сміялася і не заперечувала. Через тиждень виклав фрагмент на свою сторінку проєкту, вона попросила прибрати. Твоя позиція «ти ж не була проти зйомки» — чого вона не враховує?

Питання

Ти знімаєш загальний план шкільного концерту в актовій залі: сцена, глядачі, все відкрито. Чи потрібно брати письмову згоду в кожного, хто потрапив у кадр?

Крок 6

Соціальна інженерія голосом

Найпоширеніша схема не потребує ані зламу, ані вірусу. Вона потребує тридцяти секунд твого голосу і поспіху

Виглядає це так. Дзвінок з незнайомого номера. Голос — мамин, бабусин або братів. Дуже погана чутність. Людина плаче або говорить швидко: сталася біда, потрібні гроші просто зараз, нікому не кажи, я зараз не можу говорити довго.

Розберемо схему по ланках — важливо побачити, що голос тут лише одна ланка з п'яти, і не найважливіша.

Ланцюг шахрайства з клонованим голосом і точка, де його рве протокол довіри П'ять ланок: публічний запис голосу, клонування, дзвінок нібито від родича, тиск терміновістю й секретністю, переказ грошей. Протокол довіри розриває ланцюг між четвертою і п'ятою ланкою: кодове слово і зворотний дзвінок на відомий номер. 1 · матеріал сторіс, відео з класу, голосове у чаті — 30 секунд 2 · клон застосунок робить голос, який каже будь-що 3 · дзвінок незнайомий номер, погана чутність — вона тут навмисно 4 · тиск «терміново», «нікому не кажи», «часу немає» — головна ланка 5 · переказ гроші, код із SMS, фото картки, встановлений застосунок × Тут ланцюг рветься: протокол довіри · питаю кодове слово — його немає в жодному відео · кладу слухавку і дзвоню сам на номер із контактів · гроші, коди й паролі по телефону не передаються ніколи · чекаю 10 хвилин: терміновість — інструмент, а не обставина Чому не варто рвати ланку 2 «Не викладати нічого» — не рішення: голос є в шкільному відео, у голосовому в чаті, у відповіді на дзвінок незнайомця. Рвати треба ту ланку, яку ти контролюєш.
Ланка 4 — головна: без поспіху й секретності схема не працює, навіть якщо голос ідеальний. Тому протокол довіри цілиться саме туди.
Це не лише про бабусь У лютому 2024 року співробітник фінансового відділу інженерної компанії Arup у Гонконзі переказав шахраям близько 25 мільйонів доларів. Він засумнівався в листі — і заспокоївся після відеодзвінка, де були «фінансовий директор» і кілька знайомих колег. Усі учасники дзвінка, крім нього самого, були згенеровані з публічних записів корпоративних нарад. Людина була уважна. Уважності виявилося недостатньо — бракувало саме процедури підтвердження іншим каналом.
Питання

Тобі дзвонить бабуся своїм голосом, дуже схвильована, і просить терміново переказати гроші на картку, яку зараз продиктує. Що ти робиш до того, як щось надсилати?

Крок 7

Конструктор протоколу довіри

Складаєш правила для своєї родини — і отримуєш готову пам'ятку: її можна роздрукувати й покласти біля телефона, а текст поїде на сервер як trust-protocol.md

Протокол працює тому, що спирається не на розпізнавання, а на знання, якого немає в жодному записі голосу. Заповни чотири поля — сторінка перевірить їх і збере пам'ятку.

Чотири поля

що ніколи не робиться по телефону

Пам'ятка з'явиться нижче — окремою карткою і готовим текстом для trust-protocol.md.

Чому це працює навіть проти ідеального голосу Кодове слово ніде не звучало: його немає ані в сторіс, ані в шкільному відео, ані в голосовому повідомленні. Зворотний дзвінок повертає розмову в канал, який контролюєш ти: номер узято з твоїх контактів, а не з екрана вхідного дзвінка. Пауза знімає єдиний ресурс, на якому тримається вся схема, — поспіх.
Слово має бути вимовним у стресі Не роби з кодового слова пароль. Його доведеться згадати вночі, схвильованим, у поганому зв'язку. Два непов'язані звичайні слова — «мідний вересень», «синій ліхтар» — запам'ятовуються і не вгадуються. Дата народження, кличка кота з профілю й прізвище не годяться: усе це є в мережі.
Питання

Молодший брат пропонує зробити кодовим словом кличку вашого собаки — її точно всі запам'ятають. Що з цим не так?

Крок 8

Згода в проєкті: consent.md і поле consent

Минулого уроку поле consent у маніфесті було формальністю. Сьогодні воно стає блокуючим критерієм

У media.json кожен запис описує один твір. Поле consent відповідає на просте питання: чий образ або голос тут звучить і на якій підставі. Порожній рядок — це не відповідь.

ЗначенняКоли доречнеКоли це порушення
"n/a" у творі немає жодної реальної людини: інструментальний трек, синтетичний голос без прототипу, абстрактне відео у відео звучить голос однокласника або видно його обличчя — формально заповнено, по суті обман
"written" є підписаний бланк; поруч поле з датою і хто підписав бланк «буде потім», а файл уже опубліковано
"self" звучить тільки твій власний голос і твоє обличчя у кадр потрапив ще хтось — навіть на задньому плані
"withdrawn" згоду відкликано: матеріал зі сторінки прибрано, запис лишається в маніфесті як історія значення поставлено, а файл на сторінці лишився
media.json — фрагмент після оновлення{ "items": [ { "file": "school-canteen.mp3", "tool": "Suno", "model": "v4", "prompt": "lo-fi hip-hop, шкільна їдальня, 80 bpm, без вокалу", "license": "особисте навчальне використання", "duration_sec": 62, "size_mb": 1.4, "consent": "n/a", "consent_note": "інструментал, жодного реального голосу" }, { "file": "interview-clip.mp4", "tool": "Runway", "model": "Gen-3", "prompt": "коридор школи, ранкове світло, статична камера, 12 секунд", "license": "особисте навчальне використання", "duration_sec": 12, "size_mb": 8.6, "consent": "written", "consent_note": "О. Марченко, бланк від 14.03, копія у вчителя", "consent_scope": "голос, обличчя не показується", "consent_withdraw": "лист мені або вчителю, знімається того самого дня" } ] }
Перевір JSON перед заливанням Кома після останнього елемента — найчастіша причина того, що чекер каже «маніфест не парситься». І пам'ятай пастку з уроку 5: у PowerShell 5.1 > media.json пише UTF-16 з BOM, і jq на такому файлі падає з незрозумілою помилкою.
перевірка маніфесту
$ jq -e '.items | all(.consent != null and .consent != "")' media.json true $ jq -r '.items[] | "\(.file)\t\(.consent)"' media.json school-canteen.mp3 n/a interview-clip.mp4 written

Другий файл — consent.md. Це людський текст, а не JSON: правила твого проєкту плюс бланк, який можна роздрукувати. Мінімальна структура — п'ять розділів.

  1. Що я роблю — одне речення про проєкт;
  2. Чий образ і голос у ньому є — поіменно;
  3. Де це публікується — конкретна адреса сторінки і хто її бачить;
  4. Що я не роблю — не передаю матеріал третім особам, не завантажую медіафайли на сервер, не використовую поза проєктом;
  5. Бланк згоди — чотири поля з кроку 5 плюс місце для дати й підпису (для неповнолітніх — підпис одного з батьків).
Правило модуля лишається чинним consent.md, trust-protocol.md, media.json і конфіг — це текст, вони їдуть по FTP. Самі .mp3 і .mp4 лишаються в media-local/ у тебе на комп'ютері. Сервер їх і не прийме: спрацює наскрізний критерій no_media.
Питання

У записі про відео стоїть "consent": "n/a". У самому відео за кадром звучить голос однокласника, який погодився «усно, на перерві». Чи пройде цей запис блокуючий критерій consent — і чи все тут гаразд по суті?

Крок 9

Твій сервер як чужий ресурс

Друга лінія уроку. Тут ніхто нікого не обманює голосом — просто твої диск і трафік витрачає хтось інший

На VPS живуть три класи. Диск, трафік і процесор там спільні, тому кожен файл, який ти залив, — це місце, якого не буде в сусіда. У цьому кроці розберемо два способи, якими ресурс витікає непомітно. Третій — файл, що прикидається не тим, чим є, — чекає в кроці 11.

Спосіб перший: дискова квота

Уяви, що обмежень немає і хтось залив 4 ГБ вихідного відео «щоб не загубилося». Що станеться далі — по порядку:

  1. розділ заповнюється, і писати не може вже ніхто: ні сусід по серверу, ні сам сервер;
  2. nginx не може дописати журнал і починає віддавати помилки на сторінки, які раніше працювали;
  3. тимчасові файли не створюються — падають ті сервіси, що з ними працюють;
  4. резервна копія не робиться, бо для неї немає місця;
  5. розбирати це доводиться вручну, і сайти всіх трьох класів лежать доти, доки місце не звільнять.

Тому запобіжників у цьому курсі два, і працюють вони незалежно. Перший — ліміт на розмір одного файлу: 2 МБ на FTP-приймальні. Другий — квота на весь акаунт. Ліміт рятує від одного великого файлу, квота — від тисячі маленьких.

скільки я займаю
$ du -sh ~/www ~/upload ~/data 1.8M /home/ТВІЙ-ЛОГІН/www 240K /home/ТВІЙ-ЛОГІН/upload 64K /home/ТВІЙ-ЛОГІН/data $ du -ah ~/www | sort -rh | head -5 1.8M /home/ТВІЙ-ЛОГІН/www 1.1M /home/ТВІЙ-ЛОГІН/www/infographic 612K /home/ТВІЙ-ЛОГІН/www/book 96K /home/ТВІЙ-ЛОГІН/www/media 44K /home/ТВІЙ-ЛОГІН/www/infographic/data.csv

Числа у виводі — приклад із демонстраційного акаунта. У себе побачиш свої.

Спосіб другий: чужий сайт вантажить твої файли

Уяви подовжувач, увімкнений у твою розетку з сусідньої квартири. Лампа світить у них, а рахунок за світло приходить тобі.

У вебі це зветься hotlinking. Хтось знаходить твоє зображення. І вставляє його у свою сторінку прямим посиланням: <img src="http://91.219.61.4/s/твій-логін/media/cover.png">.

Файл лишається в тебе. Сторінка — в них. А ось трафік — подивись на схему.

Hotlinking: чий трафік витрачається Браузер відвідувача відкриває чужу сторінку і отримує від чужого сервера лише 2 кілобайти HTML, а зображення на 480 кілобайт тягне окремим запитом просто з сервера учня. Увесь вагомий трафік оплачує учень, а сторінку й відвідувачів отримує чужий сайт. Браузер відвідувача відкриває evil.example і бачить одну сторінку Сервер evil.example віддає HTML сторінки їхній трафік: 2 КБ вони отримують відвідувача й рекламу Твій сервер віддає зображення cover.png твій трафік: 480 КБ на кожен показ ти не отримуєш ані відвідувача, ані згадки GET / — 2 КБ GET /media/cover.png — 480 КБ заголовок Referer: https://evil.example
Ключова деталь: браузер робить два різні запити до двох різних серверів. У другому запиті браузер сам повідомляє, з якої сторінки він прийшов, — заголовком Referer. Саме на цьому й будується захист.

Скільки коштує чужа сторінка

Порахуй свій випадок. Числа за замовчуванням — ілюстративні, підстав свої.

твій вихідний трафік за місяць

Питання

Однокласник каже: «Хай беруть мою картинку, мені не шкода, файл же нікуди не дівається». Назви два наслідки, яких він не врахував.

Крок 10

Захист від hotlink: перевірка Referer

Правило в конфігу: якщо запит на файл прийшов зі сторінки чужого сайту — відповідаємо 403

Коли браузер вантажить зображення, вставлене в сторінку, він додає заголовок Referer — адресу сторінки, з якої прийшов запит. Історична помилка в назві (правильно було б Referrer) так і лишилася в стандарті з 1996 року.

подивитися Referer у своїх логах
$ awk '{print $11}' ~/logs/access.log | sort | uniq -c | sort -rn | head -5 842 "http://91.219.61.4/s/ТВІЙ-ЛОГІН/media/" 311 "-" 127 "https://evil.example/gallery" 18 "http://91.219.61.4/s/ТВІЙ-ЛОГІН/"

Третій рядок — саме той випадок. "-" означає, що заголовка не було зовсім: так виглядає прямий перехід за посиланням, відкриття з закладок або запит із curl.

Правило для nginx

~/conf/media.conflocation /media/ { # none — заголовка Referer немає взагалі (пряме відкриття, закладка) # blocked — заголовок є, але проксі або фаєрвол вирізали з нього адресу # server_names — Referer вказує на мій власний сайт valid_referers none blocked server_names; if ($invalid_referer) { return 403; } }

Рядок valid_referers перелічує три випадки, коли запит вважається своїм. none — заголовка немає зовсім: людина відкрила картинку прямо за посиланням або з закладки. blocked — заголовок був, але проксі чи фаєрвол вирізали з нього адресу. server_names — заголовок вказує на твій власний домен.

Усе, що в цю трійку не потрапило, — чужа сторінка. Саме таким запитам nginx і віддає 403. Твоя картинка при цьому й далі відкривається з твого сайту та за прямим посиланням.

Свій висновок nginx тримає у прапорці $invalid_referer: порожньо — запит свій, 1 — чужий. Звідси й if у конфігу.

Те саме на Apache, якщо в тебе .htaccess

~/www/media/.htaccessRewriteEngine On # порожній Referer пропускаємо — інакше зламається пряме відкриття RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^https?://([^/]+\.)?ТВІЙ-ЛОГІН\.nstekh\.uk/ [NC] RewriteRule \.(png|jpe?g|gif|svg|webp)$ - [F,L]

Перевірка: два запити, два різні коди

Linux, macOS, Git Bash
$ curl -s -o /dev/null -w '%{http_code}\n' -H 'Referer: https://evil.example' http://91.219.61.4/s/ТВІЙ-ЛОГІН/media/cover.png 403 $ curl -s -o /dev/null -w '%{http_code}\n' -H 'Referer: http://91.219.61.4/s/ТВІЙ-ЛОГІН/media/' http://91.219.61.4/s/ТВІЙ-ЛОГІН/media/cover.png 200 $ curl -s -o /dev/null -w '%{http_code}\n' http://91.219.61.4/s/ТВІЙ-ЛОГІН/media/cover.png 200
У PowerShell curl — це не curl У Windows PowerShell 5.1 curl — псевдонім Invoke-WebRequest, і ключі -H, -o, -w там означають зовсім інше. Пиши curl.exe повністю — тоді працюють ті самі команди, що вище.
Найчастіша поломка: правило б'є по своїх Якщо прибрати none зі списку, 403 почне отримувати й пряме відкриття файлу: у такому запиті Referer порожній. Учень тестує сторінку, бачить 403 на власній картинці й починає ламати конфіг далі. Тримай none у списку — третій запит у перевірці вище саме про це.
Чесно про надійність Referer надсилає клієнт, тому будь-хто може підставити туди що завгодно однією опцією curl. Це не замок, а табличка «не заходити»: вона зупиняє масовий випадок — чужий сайт, що вставив твоє зображення, — і не зупиняє того, хто цілиться саме в тебе. Для реального захисту використовують посилання з підписом і терміном дії; механізм підпису буде на уроці 12, коли розберемо HMAC.
Що саме ти захищаєш у цьому курсі У ~/www/media/ медіафайлів немає — правило модуля. Правило прикриває сторінку-опис і невеликі зображення до 500 КБ. Ти вчиш механізм, який знадобиться на справжньому сайті, а тут перевіряєш його на живому сервері й бачиш обидва коди відповіді.
Питання

Захист від hotlink налаштовано, сторінка /media/ відкривається. Але ти клацаєш на зображення правою кнопкою і вибираєш «відкрити в новій вкладці». Браузер показує 403 Forbidden. Що саме в конфігу не так?

Крок 11

Підміна типу файлу

У теці лежить clip.mp4. Це не означає, що це відео

Ім'я файлу придумує той, хто його завантажує. Заголовок Content-Type надсилає його ж браузер або його ж скрипт. Обидві ці «характеристики» файлу — просто текст, який прийшов від клієнта разом із файлом. Довіряти їм — те саме, що вірити напису на коробці, не зазираючи всередину.

Три джерела інформації про тип файлу і довіра до кожного Розширення файлу і заголовок Content-Type надсилає клієнт, тому довіра до них нульова. Перші байти файлу — властивість самого вмісту; у прикладі вони дорівнюють 4D 5A, тобто MZ, що означає виконуваний файл Windows, а не відео. Файл прийшов на сервер під іменем clip.mp4 Розширення .mp4 його придумав той, хто завантажував файл довіра: жодної Заголовок Content-Type: video/mp4 його надіслав клієнт разом із файлом, у тому самому запиті довіра: жодної Перші байти самого файлу 4D 5A 90 00 03 00 00 00 → «MZ» → виконуваний файл Windows це властивість вмісту: підробити її, не зіпсувавши файл, набагато складніше довіра: висока
Утиліта file робить саме це: читає початок файлу й порівнює з базою відомих сигнатур. Тому вона й каже правду про clip.mp4, який насправді не відео.

Сигнатури, які варто впізнавати

ФорматПерші байтиЯк читається
PNG89 50 4E 47 0D 0A 1A 0A.PNG….
JPEGFF D8 FFбез текстового вигляду
GIF47 49 46 38 39 61GIF89a
MP4, MOV… 66 74 79 70 (з 5-го байта)ftyp
ZIP, DOCX, XLSX50 4B 03 04PK..
Виконуваний файл Windows4D 5AMZ
Виконуваний файл Linux7F 45 4C 46.ELF
перевірка вмісту, а не імені
$ file --mime-type -b ~/upload/clip.mp4 application/x-dosexec $ head -c 8 ~/upload/clip.mp4 | xxd 00000000: 4d5a 9000 0300 0000 MZ...... $ head -c 12 ~/media-local/real-clip.mp4 | xxd 00000000: 0000 0020 6674 7970 6973 6f6d ... ftypisom $ find ~/www/media -type f -exec file --mime-type -b {} \; text/html application/json text/plain
Чому в критерії mime саме text/* і application/json У ~/www/media/ за правилами теми живуть тільки .html, .json, .md, .css і .js. Усе це file бачить як текст або JSON. Будь-що бінарне означає, що в теку потрапив файл, якого там бути не мало. Обережно з .svg: file часто віддає на нього image/svg+xml, і критерій не пройде — тримай схеми всередині index.html, як ми робимо на всіх уроках.
Сигнатура — необхідна перевірка, але не достатня Існують файли-поліглоти: коректний GIF, у хвості якого лежить код. file чесно скаже image/gif, а сервер, налаштований виконувати такий файл, його виконає. Тому перевірка сигнатури — лише перший рубіж. Другий, головний: тека з завантаженнями нічого не виконує. Саме про це блокуючий критерій no_exec.
критерій no_exec: знайти і зняти біт x
$ find ~/www/media -type f -perm -u+x /home/ТВІЙ-ЛОГІН/www/media/consent.md $ chmod 644 ~/www/media/consent.md $ find ~/www/media -type f -perm -u+x # порожній вивід — критерій пройдено

Найчастіша причина цієї помилки — файл скопійовано з Windows-розділу або з флешки: там прав Linux немає, і при копіюванні біт x ставиться на все підряд.

Питання

Форма завантаження перевіряє Content-Type запиту: якщо не video/mp4 — відхиляє. Чому ця перевірка не захищає ні від чого?

Крок 12

Ліміт розміру завантаження і код 413

Останній запобіжник спрацьовує ще до того, як файл дійде до диска

Коли клієнт надсилає файл, він спершу надсилає заголовки, а серед них — Content-Length. Сервер порівнює це число з власним лімітом і, якщо ліміт перевищено, обриває розмову відразу — не приймаючи тіло запиту. Це важливо: диск не витрачається взагалі.

Де саме зупиняється завантаження завеликого файлу Запит із файлом на 8 мегабайтів проходить перевірку заголовків у nginx, де ліміт становить 2 мегабайти, і одразу отримує відповідь 413. Обробник на сервері й диск при цьому не задіяні зовсім. Клієнт POST із файлом Content-Length: 8 МБ nginx client_max_body_size 2m; 8 МБ > 2 МБ → стоп 413 Content Too Large відповідь іде відразу, тіло запиту сервер не читає Обробник і диск не викликаються зовсім: жодного байта не збережено Другий рівень тієї самої ідеї: FTP-приймальня цього курсу відхиляє файл понад 2 МБ і заборонені розширення — файл просто не з'являється в кабінеті
За стандартом HTTP (RFC 9110, розділ 15.5.14) код 413 зветься «Content Too Large»; у старших документах і старих статтях та сама відповідь називалася «Payload Too Large».
КодЩо означаєКоли ти його побачиш
403доступ заборонено hotlink-правило спрацювало на чужий Referer
413тіло запиту завелике файл більший за client_max_body_size
415тип вмісту не підтримується сервер прийняв файл, але не працює з таким типом
507на сховищі немає місця квота вичерпана — те, з чого починався крок 9
Ліміт за замовчуванням дуже маленький У nginx client_max_body_size дорівнює 1m, якщо його не вказали явно. Це найчастіша причина загадкового 413 на робочій формі: код правильний, файл нормальний, а сервер відмовляє.
Питання

Твоя форма завантаження перевіряє розмір файлу в JavaScript до надсилання й показує зрозуміле повідомлення. Навіщо тоді ще й client_max_body_size на сервері?

Крок 13

Практика: чотири файли й одна розмова вдома

Кроки 1—9 робиш у себе на комп'ютері, кроки 10—13 — заливання по FTP і перевірка. Галочки зберігаються

Межа лишається тією самою .mp3 і .mp4 з минулого уроку далі живуть у media-local/ у тебе на комп'ютері. На сервер їде тільки текст: consent.md, trust-protocol.md, оновлений media.json і конфіг hotlink-захисту. Учитель дивиться медіа очно, на твоєму екрані.
Крок 14

Автоперевірка

Чекер робить два справжні HTTP-запити з різними Referer, читає media.json і проходить file по всій теці. Спроби не обмежені

Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає /opt/lessons/08/check.sh від імені учня.

Що вчитель дивиться на твоєму екрані

Крок 15

Шкала виконання

Це те, що бачить учитель, коли виставляє оцінку.

СкладникВагаРезультат
Виконано
0%
Рекомендований бал за 12-бальною

Шість речень, які варто запам'ятати

Де найчастіше помиляються

Домашнє завдання

Узгодити протокол довіри вдома. Покажи роздруковану пам'ятку. Домовся про кодове слово з усіма, кого ти вписав у коло довіри. Зокрема з тими, хто живе окремо: слово має знати кожен, кому можуть подзвонити «твоїм голосом».

Другим абзацом допиши в trust-protocol.md, як ти перевірятимеш підозрілий дзвінок. Три конкретні дії по порядку, своїми словами. Пиши коротко: читати це буде схвильована людина.

Джерела

Звідки взяті твердження й числа

Усе, що можна перевірити, має бути перевіреним. Правові формулювання наведені близько до тексту статей

Повний список із поясненнями, що звідки взято, — у файлі urok-08-джерела.md поруч із цією сторінкою.