<? phpukraine PHP-ПЛАТФОРМА
⌕Пошук по платформі
БЕЗПЕКА

Атаки й захист на прикладах з PHP

Подивіться, як атака працює, напишіть захищений код і дізнайтеся, де Laravel і Symfony вас не прикриють.

  1. 01Натисніть на приклад під полем «Логін».
  2. 02Подивіться, де введене виривається з лапок.
  3. 03Увімкніть підготовлений запит.
ЛАБОРАТОРІЯ · SQL-ІНʼЄКЦІЯсимуляція
ЗАПИТ ДО БАЗИ ІНʼЄКЦІЯ
SELECT * FROM users WHERE login = '' OR '1'='1' -- ' AND password_hash = 'd41d8c…'
параметр 1 =

Помаранчевий блок вирвався з лапок і став частиною SQL. Решту запиту, перевірку пароля, вимкнув коментар.

ЩО ПОВЕРНЕ СЕРВЕР
Усі користувачі бази, вхід без пароля

Умова OR '1'='1' правдива для кожного рядка, а коментар відрізав перевірку пароля. Код входу бере перший рядок, а це часто адміністратор.

id · loginrole
1 · adminadmin
2 · olenauser
3 · tarasuser

Так виглядає старий код входу, де хеш пароля порівнюють прямо в SQL. Як зберігати паролі правильно, розповімо в темі «Паролі й хешування».

01 — ШЛЯХ ЗАПИТУ

Де саме бʼє кожна атака

Запит іде від браузера до бази й назад. На кожній ділянці свої атаки. Натисніть на шпильку, щоб відкрити тему.

Браузер{ }ВебсерверMiddlewareКонтролерБаза данихФайли{ }Сторонні APIXSSCSRFIDORSQLiUploadSSRF
Браузер{ }ВебсерверMiddlewareКонтролерБаза данихФайли{ }Сторонні APIXSSCSRFIDORSQLiUploadSSRF
Наведіть на шпильку: XSS, CSRF, IDOR, SQLi, Upload, SSRF.
02 — ТЕМИ

Каталог атак

Критична Висока Середня 10 розібрано
Критична OWASP 2025 A05
SQL-інʼєкції

Введення стає частиною запиту до бази.

Як часто в PHP-коді часто
Висока OWASP 2025 A05
XSS · міжсайтовий скриптинг

Чужий скрипт виконується на вашій сторінці від імені користувача.

Як часто в PHP-коді дуже часто
Середня OWASP 2025 A01
CSRF

Інший сайт відправляє форму від імені залогіненої людини.

Як часто в PHP-коді іноді
Висока OWASP 2025 A08
Mass assignment

Користувач дописує в запит поле is_admin, і модель його приймає.

Як часто в PHP-коді часто
Критична OWASP 2025 A01
IDOR: доступ до чужих даних

Змінили id в адресі й побачили чуже резюме.

Як часто в PHP-коді дуже часто
Висока OWASP 2025 A04
Паролі й хешування

md5, sha1, власна «сіль» і чому password_hash достатньо.

Як часто в PHP-коді іноді
Критична OWASP 2025 A06
Завантаження файлів

avatar.php замість avatar.png і виконання коду на сервері.

Як часто в PHP-коді часто
Висока OWASP 2025 A01
SSRF

Сервер іде за URL від користувача і стукає у вашу внутрішню мережу.

Як часто в PHP-коді іноді
Критична OWASP 2025 A02
Секрети й .env

.env у публічній теці, ключі в репозиторії й у логах.

Як часто в PHP-коді часто
Середня OWASP 2025 A07
Сесії й cookies

Фіксація сесії, відсутні Secure, HttpOnly і SameSite.

Як часто в PHP-коді часто

Як часто в PHP-коді: оцінка редакції PHP Ukraine з досвіду ревʼю й аудитів, а не статистика. OWASP: категорія в OWASP Top 10, редакція 2025 року.

// ЯК У PHP UKRAINE

Реальні захисти цього сайту

resources/views/profile/show.blade.php «Про себе» розробника друкується лише через {{ }}. TextBlocks ділить текст на заголовки, списки й абзаци, а Blade екранує кожен шматок, тож тег у профілі стає буквами.
src/Content/Infrastructure/Markdown/CommonMarkRenderer.php Markdown статей, які пишуть читачі, рендериться з html_input: strip і allow_unsafe_links: false. Сирий HTML вирізається, посилання javascript: не стають посиланнями.
src/Projects/Domain/ProjectLink.php Посилання на сайт і репозиторій проєкту приймаються лише зі схемою http або https і справжнім доменом, тож у href не потрапить javascript:.
src/Hiring/Infrastructure/Catalog/EloquentJobPageQuery.php Навіть сирий фрагмент SQL для сортування схожих вакансій отримує значення через ? і масив bindings, а не склеюванням рядка.
bootstrap/app.php Кожна форма групи web проходить перевірку CSRF. Винятки лише для launch/subscribe і events, де сесії ще немає; ці адреси обмежує throttle.
routes/web.php Вхід, скидання пароля й відгук на вакансію мають ліміт спроб через throttle: 10, 5 і 5 на хвилину.
app/Models/User.php Пароль має cast hashed: Laravel хешує його bcrypt ще до запису, у базі немає відкритого тексту.
app/Auth/AccountSecurity.php Зміна пошти чи пароля просить підтвердити, хто за клавіатурою: поточний пароль або свіжий вхід через провайдера, з яким повʼязано акаунт. Новий пароль завершує всі інші сесії.
app/Http/Controllers/ProfileController.php Резюме приймається лише як PDF до 5 МБ, лягає на приватний диск під випадковою назвою й віддається тільки через маршрут, що перевіряє, хто питає.
app/Http/Middleware/SecurityHeaders.php Кожна відповідь несе nosniff, X-Frame-Options: SAMEORIGIN, Referrer-Policy і Permissions-Policy, а через https ще й HSTS.