Сьогодні ти отримуєш власний акаунт на справжньому сервері. Логін і пароль видає вчитель. До кінця уроку ти зайдеш на цю машину зі свого комп’ютера й попрацюєш на ній руками.
На уроці ти навчишся
Ти поклав сторінку в теку www і надіслав однокласнику адресу. У себе відкриваєш — бачиш текст. Він відкриває ту саму адресу — бачить великий напис 403 Forbidden.
На уроці ти навчишся
Учора ввечері ти правив розділ книги. Щоб швидко перевірити здогадку, поставив chmod 600 на один файл, а на теку — 777, «поки що, потім поверну». Потім тебе покликали вечеряти.
На уроці ти навчишся
У твій приймач тепер летить те, що ти не контролюєш: чужі браузери, скрипти й боти. Ти додаєш серверну перевірку кожного поля, виводиш чуже ім'я з екрануванням, ставиш honeypot і ліміти на довжину, розмір тіла й частоту. Потім сам проводиш шість атак на власний обробник і записуєш очікуваний та фактичний код відповіді.
На уроці ти навчишся
Ти збираєш таблицю з відповідями однокласників і прибираєш із неї конкретних людей. На екрані видно, чому «ми ж прибрали прізвища» не працює: у таблиці на 24 людини 12 рядків усе одно вказують рівно на одну особу. Заразом ти чистиш EXIF своїх фото і записуєш кожне перетворення колонок у журнал.
На уроці ти навчишся
Чистий data.csv з минулого уроку стає інфографікою: діаграми малює твій власний chart.js, а поруч стоїть таблиця з тими самими числами. Ти перевіряєш палітру очима людини, яка не розрізняє червоне й зелене, і підписуєш діаграму джерелом, датою і розміром вибірки. Третя частина уроку — чужий код: що дає авторові бібліотеки один рядок script з чужого сервера і як прив'язати цей файл атрибутом integrity.
На уроці ти навчишся
Ти генеруєш трек на 30—90 секунд і відеофрагмент на 10—30 секунд — і жоден із цих файлів не потрапляє на сервер. Туди їде текст: сторінка-опис, транскрипт і маніфест походження media.json з полями tool, model, prompt, license, consent, duration_sec, size_mb. Вагу файлу ти рахуєш із тривалості й бітрейту, а потім звіряєш розрахунок командою ffprobe.
На уроці ти навчишся
Урок веде дві лінії. Перша — чий образ і голос ти маєш право використати: статті 307 і 308 Цивільного кодексу, бланк згоди і кодове слово, яке працює навіть при ідеально схожому голосі в телефоні. Друга — твій сервер як чужий ресурс: ти забороняєш hotlink перевіркою заголовка Referer, звіряєш сигнатуру файлу з його розширенням і ставиш ліміт розміру завантаження з кодом 413.
На уроці ти навчишся
У ~/data/leads.jsonl уже лежать справжні заявки з твоєї форми. Ти пишеш скрипт ~/bin/report.sh, який читає цей приватний файл з іменами й адресами, а віддає публічний report.json із самими числами. Межу між приватним і публічним сьогодні проводиш ти сам: кожен зайвий ключ у цьому JSON бачить будь-хто у світі.
На уроці ти навчишся
report.sh переїжджає в розклад cron і з цієї миті працює без тебе. Ти видаєш йому рівно потрібні права замість chmod 777, береш для зовнішнього сервісу токен тільки на читання з терміном дії й пишеш у лог рядок, з якого видно подію, але немає жодного чужого імені. Наприкінці налаштовуєш ротацію логу і код завершення, за яким видно падіння.
На уроці ти навчишся
Ти генеруєш пару ключів ed25519 у себе на комп'ютері, кладеш публічну частину в ~/.ssh/authorized_keys і заходиш на сервер без пароля — приватний ключ машину не залишає. Друга лінія уроку: збираєш у Zapier або IFTTT сценарій «тригер → фільтр → дія», який стукає у твій api/hook.php, і розбираєш екран згоди сервісу. Приймач сьогодні приймає подію від будь-кого — це навмисно, і це закриє урок 12.
На уроці ти навчишся
Учитель кладе чужий запис у твій events.jsonl, знаючи лише адресу ендпойнта — і відрізнити його від справжнього ти не зможеш. Ти закриваєш цю вразливість підписом: hash_hmac рахує HMAC від тіла запиту, а hash_equals порівнює підписи за сталий час. Далі додаєш вікно 300 секунд для X-Timestamp і сховище nonce, щоб той самий запит не пройшов удруге.
На уроці ти навчишся
За три кліки в панелі «Мережа» ти дістаєш ключ із навчального бота, у якому він лежить просто в chat.js — і робиш свого інакше. Ключ читає api/chat.php з файлу ~/.env уже на сервері, а браузер знає тільки адресу /api/chat.php. Заразом пишеш system.md із роллю, межами і формулою відмови бота, ставиш серверні перевірки й налаштовуєш .gitignore.
На уроці ти навчишся
Твій бот працює, але передає моделі будь-який підкинутий текст як інструкцію і не має обмежень. Ти ставиш межу «системний промпт / дані користувача», фільтр виходу з канаркою, ліміт довжини 400 символів із кодом 413 і ліміт частоти 10 запитів за 60 секунд із кодом 429. Заразом ганяєш сканер по ~/www і по історії git — і якщо ключ знайдено, першою дією відкликаєш його.
На уроці ти навчишся
Команда зводить п'ять окремих робіт модуля — книгу, дашборд, опис AI-медіа, бота і журнал автоматизації — в один сайт зі спільною навігацією на https://studyua.91.219.61.4.nip.io/s/team-N/. Далі всі форми проходять однакову послідовність із шести перевірок: CSRF-токен, honeypot, серверна валідація, екранування, ліміти довжини й частоти. Наприкінці команда проганяє чек-лист готовності з 15 пунктів і закриває всі блокуючі.
На уроці ти навчишся
Останній урок модуля: кожна група перевіряє продукт сусідньої за списком із 12 пунктів і сама отримує звіт про свої вразливості. Спершу підписуються правила аудиту — тільки призначена ціль, тільки чек-лист, нічого не псувати; вихід за межі анулює звіт усієї команди. Далі 30 хвилин на виправлення, повторний прогін audit.sh і тривилинний захист продукту перед класом.
На уроці ти навчишся
/s/твій-логін/ · вхід на сервер: ssh твій-логін@91.219.61.4 · зміна пароля: passwd