Минулого уроку ти згенерував трек і відеофрагмент і описав їх
у 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, чеклист до зеленого |
Спокійний перелік можливостей із датами й джерелами. Без «нас усіх обдурять» — просто те, що вже існує
Уяви маску, зроблену рівно за твоїм обличчям. Колись таку робив гример на кіностудії — кілька тижнів. Тепер її будує програма за десятком фото і накладає на чуже відео. Такий ролик і звуть deepfake.
Ти вже бачив це зсередини: минулого уроку ти написав промпт і отримав готовий трек. Технологія одна й та сама. Різниця лише в тому, чиє обличчя й чий голос беруть за вихідний матеріал.
| Що | Що потрібно на вході | Де межа |
|---|---|---|
| Заміна обличчя у відео | кілька десятків фото людини — стільки є в будь-якому відкритому профілі | складні ракурси, рука перед обличчям, різке світло збоку |
| Клонування голосу | короткий зразок мовлення: VALL-E показала результат із 3 секунд, Voice Engine від OpenAI — з 15 | рідкісна мова, сильний акцент, довгий монолог зі складною інтонацією |
| Оживлення фото | одне фото анфас | рухи голови вбік, промова довша за кілька секунд |
Зверни увагу на середній рядок. Три секунди голосу — це одна фраза в сторіс. П'ятнадцять секунд — це будь-яке відео, де ти щось розповідаєш. Це не аргумент «нічого не викладай»: це аргумент за те, щоб мати домовленість на випадок дзвінка.
Однокласник каже: «Мій голос підробити неможливо, я ніде не викладаю довгих відео». У нього є один сторіс, де він 8 секунд вітається з підписниками. Що ти йому відповіси?
Вісім карток. Кожна — текстовий опис фото, аудіо або відео: самих файлів тут немає, бо медіа на сервер не заливаються. Вирішуй за описом
Правила чесні: у частині карток «ознаки підробки» є там, де підробки немає, і навпаки. Саме так виглядає реальний матеріал. Відповідай швидко, як відповідав би на телефонний дзвінок, і не пропускай карток — розбір з'являється відразу після вибору.
У дослідженні UCL (2023) люди правильно розпізнавали синтезоване мовлення приблизно в 73% випадків, а спеціальне тренування майже не покращувало результат. Який практичний висновок із цього числа?
Шість зон, куди дивляться першими. Знати їх корисно. Спиратися на них — ні
Коли синтезована картинка не сходиться, вона не сходиться в тих самих місцях. Це там, де модель домальовує стик двох шарів. Ось шість зон, де це видно найчастіше.
Тому правило уроку інше й воно не старіє: перевіряй джерело, а не картинку. Хто це надіслав, з якого акаунта, чи є цей матеріал ще десь, чи можна зателефонувати людині на відомий номер. Джерело перевіряється за хвилину; вдивляння не дає відповіді ніколи.
| Питання | Скільки часу | Наскільки надійно |
|---|---|---|
| «Чи є артефакти на межі обличчя?» | хвилини | ненадійно й з кожним роком гірше |
| «Звідки цей файл узявся?» | 1 хв | надійно: у пересланого відео немає першоджерела |
| «Що каже сама людина, якщо їй передзвонити?» | 1 хв | надійно, якщо номер узято з контактів, а не з дзвінка |
| «Чи є на матеріалі мітка походження (C2PA)?» | секунди | корисно, коли мітка є; її відсутність нічого не доводить |
media.json з минулого уроку —
та сама ідея, зроблена вручну.Під час відеодзвінка губи співрозмовника відстають від звуку приблизно на пів секунди. А картинка час від часу розсипається квадратами. Який висновок правильний?
Це не етика й не «домовленість по-дружньому». В Україні це стаття Цивільного кодексу, і вона стосується твого шкільного проєкту
Дві статті, які варто вміти переказати своїми словами. Формулювання в кодексі короткі, тому нижче ти читаєш їх майже дослівно.
| Стаття | Про що вона | Що це означає для тебе |
|---|---|---|
| ЦК 307 | «Фізична особа може бути знята на фото-, кіно-, теле- чи відеоплівку лише за її згодою». Згода припускається, якщо зйомка ведеться відкрито на вулиці, на зборах, конференціях, мітингах та інших заходах публічного характеру. | Момент зйомки. На шкільному концерті чи мітингу знімати загальний план можна. Знімати однокласника в коридорі впритул, коли він проти, — ні. |
| ЦК 308 | Фотографія й інші твори, на яких зображено фізичну особу, можуть бути публічно показані, відтворені, розповсюджені лише за згодою цієї особи. | Момент публікації. Це окрема згода. «Він же дозволив зняти» не означає «він дозволив викласти на сайт». |
До синтезу це застосовується так само. Якщо ти згенерував відео, де говорить обличчя однокласника, — ти розповсюджуєш зображення особи, і потрібна її згода. Те, що обличчя намалював алгоритм, нічого не змінює: впізнають конкретну людину.
Довгі юридичні бланки в класі не працюють. Робочий мінімум — чотири питання, на які згода має відповідати однозначно.
| Поле | Погано | Робочий варіант |
|---|---|---|
| Хто | «однокласники» | ім'я і прізвище кожного, чиє обличчя або голос звучить; для неповнолітніх — підпис одного з батьків |
| На що саме | «на використання матеріалів» | «голос у 40-секундному аудіо для проєкту про шкільну їдальню; обличчя не використовується» |
| Де публікується | «в інтернеті» | «сторінка http://91.219.61.4/s/login/media/,
відкрита для всіх; сам файл на сервер не заливається» |
| Як відкликати | не вказано | «написати мені або вчителю; матеріал прибирається зі сторінки
того самого дня, запис у media.json міняється
на consent: "withdrawn"» |
Ти зняв однокласницю на відео на перерві — вона сміялася і не заперечувала. Через тиждень виклав фрагмент на свою сторінку проєкту, вона попросила прибрати. Твоя позиція «ти ж не була проти зйомки» — чого вона не враховує?
Ти знімаєш загальний план шкільного концерту в актовій залі: сцена, глядачі, все відкрито. Чи потрібно брати письмову згоду в кожного, хто потрапив у кадр?
Найпоширеніша схема не потребує ані зламу, ані вірусу. Вона потребує тридцяти секунд твого голосу і поспіху
Виглядає це так. Дзвінок з незнайомого номера. Голос — мамин, бабусин або братів. Дуже погана чутність. Людина плаче або говорить швидко: сталася біда, потрібні гроші просто зараз, нікому не кажи, я зараз не можу говорити довго.
Розберемо схему по ланках — важливо побачити, що голос тут лише одна ланка з п'яти, і не найважливіша.
Тобі дзвонить бабуся своїм голосом, дуже схвильована, і просить терміново переказати гроші на картку, яку зараз продиктує. Що ти робиш до того, як щось надсилати?
Складаєш правила для своєї родини — і отримуєш готову
пам'ятку: її можна роздрукувати й покласти біля телефона, а текст
поїде на сервер як trust-protocol.md
Протокол працює тому, що спирається не на розпізнавання, а на знання, якого немає в жодному записі голосу. Заповни чотири поля — сторінка перевірить їх і збере пам'ятку.
Пам'ятка з'явиться
нижче — окремою карткою і готовим текстом для
trust-protocol.md.
Молодший брат пропонує зробити кодовим словом кличку вашого собаки — її точно всі запам'ятають. Що з цим не так?
consent.md і поле consentМинулого уроку поле consent у маніфесті було
формальністю. Сьогодні воно стає блокуючим критерієм
У media.json кожен запис описує один твір. Поле
consent відповідає на просте питання: чий образ або голос
тут звучить і на якій підставі. Порожній рядок — це не відповідь.
| Значення | Коли доречне | Коли це порушення |
|---|---|---|
"n/a" |
у творі немає жодної реальної людини: інструментальний трек, синтетичний голос без прототипу, абстрактне відео | у відео звучить голос однокласника або видно його обличчя — формально заповнено, по суті обман |
"written" |
є підписаний бланк; поруч поле з датою і хто підписав | бланк «буде потім», а файл уже опубліковано |
"self" |
звучить тільки твій власний голос і твоє обличчя | у кадр потрапив ще хтось — навіть на задньому плані |
"withdrawn" |
згоду відкликано: матеріал зі сторінки прибрано, запис лишається в маніфесті як історія | значення поставлено, а файл на сторінці лишився |
> media.json пише UTF-16 з BOM, і jq на такому
файлі падає з незрозумілою помилкою.Другий файл — consent.md. Це людський текст, а не JSON:
правила твого проєкту плюс бланк, який можна роздрукувати. Мінімальна
структура — п'ять розділів.
consent.md, trust-protocol.md, media.json
і конфіг — це текст, вони їдуть по FTP. Самі .mp3 і
.mp4 лишаються в media-local/ у тебе на комп'ютері.
Сервер їх і не прийме: спрацює наскрізний критерій no_media.У записі про відео стоїть "consent": "n/a". У самому відео
за кадром звучить голос однокласника, який погодився «усно, на перерві».
Чи пройде цей запис блокуючий критерій consent — і чи
все тут гаразд по суті?
Друга лінія уроку. Тут ніхто нікого не обманює голосом — просто твої диск і трафік витрачає хтось інший
На VPS живуть три класи. Диск, трафік і процесор там спільні, тому кожен файл, який ти залив, — це місце, якого не буде в сусіда. У цьому кроці розберемо два способи, якими ресурс витікає непомітно. Третій — файл, що прикидається не тим, чим є, — чекає в кроці 11.
Уяви, що обмежень немає і хтось залив 4 ГБ вихідного відео «щоб не загубилося». Що станеться далі — по порядку:
Тому запобіжників у цьому курсі два, і працюють вони незалежно. Перший — ліміт на розмір одного файлу: 2 МБ на FTP-приймальні. Другий — квота на весь акаунт. Ліміт рятує від одного великого файлу, квота — від тисячі маленьких.
Числа у виводі — приклад із демонстраційного акаунта. У себе побачиш свої.
Уяви подовжувач, увімкнений у твою розетку з сусідньої квартири. Лампа світить у них, а рахунок за світло приходить тобі.
У вебі це зветься hotlinking. Хтось знаходить твоє зображення.
І вставляє його у свою сторінку прямим посиланням: <img
src="http://91.219.61.4/s/твій-логін/media/cover.png">.
Файл лишається в тебе. Сторінка — в них. А ось трафік — подивись на схему.
Referer.
Саме на цьому й будується захист.Порахуй свій випадок. Числа за замовчуванням — ілюстративні, підстав свої.
Однокласник каже: «Хай беруть мою картинку, мені не шкода, файл же нікуди не дівається». Назви два наслідки, яких він не врахував.
RefererПравило в конфігу: якщо запит на файл прийшов зі сторінки
чужого сайту — відповідаємо 403
Коли браузер вантажить зображення, вставлене в сторінку, він додає
заголовок Referer — адресу сторінки, з якої прийшов запит.
Історична помилка в назві (правильно було б Referrer) так і
лишилася в стандарті з 1996 року.
Третій рядок — саме той випадок. "-" означає,
що заголовка не було зовсім: так виглядає прямий перехід за посиланням,
відкриття з закладок або запит із curl.
Рядок valid_referers перелічує три випадки, коли запит
вважається своїм. none — заголовка немає зовсім: людина
відкрила картинку прямо за посиланням або з закладки. blocked —
заголовок був, але проксі чи фаєрвол вирізали з нього адресу.
server_names — заголовок вказує на твій власний домен.
Усе, що в цю трійку не потрапило, — чужа сторінка. Саме таким запитам
nginx і віддає 403. Твоя картинка при цьому й далі відкривається
з твого сайту та за прямим посиланням.
Свій висновок nginx тримає у прапорці $invalid_referer:
порожньо — запит свій, 1 — чужий. Звідси й if
у конфігу.
.htaccesscurl — це не 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.
Що саме в конфігу не так?
У теці лежить clip.mp4. Це не означає, що це відео
Ім'я файлу придумує той, хто його завантажує. Заголовок
Content-Type надсилає його ж браузер або його ж скрипт.
Обидві ці «характеристики» файлу — просто текст, який прийшов від клієнта
разом із файлом. Довіряти їм — те саме, що вірити напису на коробці, не
зазираючи всередину.
file робить саме це: читає початок файлу
й порівнює з базою відомих сигнатур. Тому вона й каже правду про
clip.mp4, який насправді не відео.| Формат | Перші байти | Як читається |
|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | .PNG…. |
| JPEG | FF D8 FF | без текстового вигляду |
| GIF | 47 49 46 38 39 61 | GIF89a |
| MP4, MOV | … 66 74 79 70 (з 5-го байта) | ftyp |
| ZIP, DOCX, XLSX | 50 4B 03 04 | PK.. |
| Виконуваний файл Windows | 4D 5A | MZ |
| Виконуваний файл Linux | 7F 45 4C 46 | .ELF |
mime саме text/* і application/json
У ~/www/media/ за правилами теми живуть тільки
.html, .json, .md, .css
і .js. Усе це file бачить як текст або JSON.
Будь-що бінарне означає, що в теку потрапив файл, якого там бути не мало.
Обережно з .svg: file часто віддає на нього
image/svg+xml, і критерій не пройде — тримай схеми
всередині index.html, як ми робимо на всіх уроках.file чесно скаже image/gif, а сервер, налаштований
виконувати такий файл, його виконає. Тому перевірка сигнатури — лише
перший рубіж. Другий, головний: тека з завантаженнями нічого не
виконує. Саме про це блокуючий критерій no_exec.Найчастіша причина цієї помилки — файл скопійовано з
Windows-розділу або з флешки: там прав Linux немає, і при копіюванні
біт x ставиться на все підряд.
Форма завантаження перевіряє Content-Type запиту: якщо
не video/mp4 — відхиляє. Чому ця перевірка не захищає ні від чого?
413Останній запобіжник спрацьовує ще до того, як файл дійде до диска
Коли клієнт надсилає файл, він спершу надсилає заголовки, а серед них —
Content-Length. Сервер порівнює це число з власним лімітом
і, якщо ліміт перевищено, обриває розмову відразу — не приймаючи тіло
запиту. Це важливо: диск не витрачається взагалі.
413 зветься «Content Too Large»; у старших документах і
старих статтях та сама відповідь називалася «Payload Too Large».| Код | Що означає | Коли ти його побачиш |
|---|---|---|
| 403 | доступ заборонено | hotlink-правило спрацювало на чужий Referer |
| 413 | тіло запиту завелике | файл більший за client_max_body_size |
| 415 | тип вмісту не підтримується | сервер прийняв файл, але не працює з таким типом |
| 507 | на сховищі немає місця | квота вичерпана — те, з чого починався крок 9 |
client_max_body_size дорівнює 1m, якщо
його не вказали явно. Це найчастіша причина загадкового 413
на робочій формі: код правильний, файл нормальний, а сервер відмовляє.Твоя форма завантаження перевіряє розмір файлу в JavaScript до
надсилання й показує зрозуміле повідомлення. Навіщо тоді ще й
client_max_body_size на сервері?
Кроки 1—9 робиш у себе на комп'ютері, кроки 10—13 — заливання по FTP і перевірка. Галочки зберігаються
.mp3 і .mp4 з минулого уроку далі живуть у
media-local/ у тебе на комп'ютері. На сервер їде тільки текст:
consent.md, trust-protocol.md, оновлений
media.json і конфіг hotlink-захисту. Учитель дивиться медіа
очно, на твоєму екрані.Чекер робить два справжні HTTP-запити з різними
Referer, читає media.json і проходить
file по всій теці. Спроби не обмежені
Демонстраційний режим: результат згенеровано для показу.
На сервері ця кнопка викликає POST /api/check, який запускає
/opt/lessons/08/check.sh від імені учня.
curl із кроку 10 і показуєш
403 і 200;none.Це те, що бачить учитель, коли виставляє оцінку.
| Складник | Вага | Результат |
|---|
Content-Type надсилає клієнт, тому вони нічого не доводять;consent: "n/a" у відео, де звучить голос однокласника —
формально заповнено, по суті порушення;none — ламається пряме
відкриття власних файлів, і учень починає ламати конфіг далі;no_exec провалено, бо файли скопійовані з
Windows-розділу разом із бітом x;~/www/media/ додано .svg-схему, і
критерій mime падає на image/svg+xml;media.json збережено з PowerShell у UTF-16 з BOM —
jq каже «невалідний JSON», хоча вміст правильний;Узгодити протокол довіри вдома. Покажи роздруковану пам'ятку. Домовся про кодове слово з усіма, кого ти вписав у коло довіри. Зокрема з тими, хто живе окремо: слово має знати кожен, кому можуть подзвонити «твоїм голосом».
Другим абзацом допиши в trust-protocol.md, як ти
перевірятимеш підозрілий дзвінок. Три конкретні дії по порядку,
своїми словами. Пиши коротко: читати це буде схвильована людина.
Усе, що можна перевірити, має бути перевіреним. Правові формулювання наведені близько до тексту статей
Referer — RFC 9110, розділ 10.1.3;
історична помилка в написанні збереглася зі стандарту 1996 року.
rfc-editor.org,
MDN: RefererReferer у nginx — директива
valid_referers, змінна $invalid_referer,
значення none, blocked, server_names.
nginx.orgclient_max_body_size — ліміт тіла запиту в nginx,
за замовчуванням 1m.
nginx.org413 Content Too Large — RFC 9110, розділ 15.5.14
(у RFC 7231 той самий код називався «Payload Too Large»).
rfc-editor.org403 Forbidden — RFC 9110, розділ 15.5.4.
rfc-editor.orgContent-Type від клієнта — рекомендації
OWASP щодо завантаження файлів: перевірка вмісту, заборона виконання
в теці завантажень.
cheatsheetseries.owasp.orgfile — бібліотека libmagic,
перелік магічних байтів.
darwinsys.com/file,
en.wikipedia.org: List of file signaturesX-Content-Type-Options: nosniff — заборона
браузеру вгадувати тип за вмістом.
MDNПовний список із поясненнями, що звідки взято, —
у файлі urok-08-джерела.md поруч із цією сторінкою.