Коротка відповідь
middleXSS — це атака, коли зловмисник вставляє шкідливий JavaScript у веб‑сторінку, що виконується в браузері жертви. Це дозволяє красти куки, перехоплювати сесії або змінювати DOM. Захист включає escaping, CSP і Content‑Security‑Policy.
Повне пояснення
Що це і навіщо
XSS (Cross‑Site Scripting) – тип веб‑атак, що дозволяє зловмиснику виконувати скрипти у контексті браузера користувача. Це використовується для крадіжки даних, підробки UI або розповсюдження шкідливого коду.
Ключові принципи
- Injection – вставка скрипту в HTML‑вміст.
- Execution context – код виконується з правами поточної сторінки.
- DOM manipulation – зміну структури DOM, доступу до куків та localStorage.
Як працює
- Користувач вводить дані (наприклад, у форму коментаря).
- Сервер повертає ці дані без escaping.
- Браузер інтерпретує вставлений скрипт як частину DOM.
- Скрипт виконується, отримуючи доступ до сесійних даних.
Практика і реалізація (JavaScript/TypeScript)
// Приклад небезпечного рендеру
const comment = '<script>alert("XSS")</script>';
document.getElementById('comments').innerHTML = comment; // XSS
// Захищений рендер за допомогою textContent
const safeComment = document.createElement('div');
safeComment.textContent = comment;
document.getElementById('comments').appendChild(safeComment);
Тестування
- Unit: перевірка функцій escaping за допомогою Jest.
import { escapeHtml } from './utils';
expect(escapeHtml('<script>')).toBe('<script>');
- Integration: Cypress тест, що перевіряє відсутність виконання скриптів у DOM.
Безпека і приватність
- Content‑Security‑Policy:
script-src 'self'обмежує джерела скриптів. - HTTPOnly cookies: запобігає доступу до куків через JavaScript.
- Sanitization libraries: DOMPurify, xss-filters.
Альтернативи і порівняння
- Server‑side rendering з escaping vs. Client‑side rendering без sanitization.
- React: JSX автоматично escaping, але
dangerouslySetInnerHTMLпотребує ручного очищення.
Часті помилки
- Використання
innerHTMLбез escaping. - Неправильна CSP, що дозволяє inline‑скрипти.
- Залишення куків без HTTPOnly.
- Необхідність очищати дані на сервері, а не лише в клієнті.
Cheatsheet
escapeHtml(str)→<script>.- CSP header:
Content-Security-Policy: default-src 'self'; script-src 'self'. - React:
dangerouslySetInnerHTML={{ __html: safeHtml }}після очищення.
Follow‑up питання
- Як працює CSP разом з
nonce? - Які ризики пов’язані з використанням
evalу контексті XSS?