IS
Все эксперименты
живое

XSS-плейграунд — как инъекция ломает форму

Введите «отзыв» с тегом <script> и посмотрите, как он исполняется в уязвимом режиме — и как экранирование и CSP его гасят.

лабораторная запись
Зачем делал

В банке я закрываю формы от инъекций каждый день, и на собеседованиях вижу: XSS многие «знают теоретически». Хотелось демо, где инъекция реально срабатывает — безопасно, в песочнице.

Что узнал

Разница между `innerHTML` и `textContent` — это буквально разница между дырой и её отсутствием. А CSP — это второй рубеж: даже если экранирование где-то забыли, `script-src` без unsafe-inline не даст инъекции исполниться.

Где сломалось

Само демо и есть контролируемая «поломка». Чтобы инъекция срабатывала по-настоящему, но не трогала основной сайт, пришлось вынести её в iframe с sandbox и отдельным, намеренно ослабленным CSP.

Стек
Reactsandbox iframeCSP

Три режима одной формы

Ниже — «форма отзыва», отрендеренная тремя способами. Введите payload (кнопка подставит классический <img onerror>) и переключайте режимы: уязвимыйэкранированныйCSP. Демо живёт в изолированном sandbox-iframe, так что инъекция не может выйти за его пределы.

живое демо· sandbox
Демо загружается…

Что здесь важно

CSP-режим оставляет уязвимый innerHTML, но добавляет заголовок Content-Security-Policy: script-src 'self'. Даже вставленный скрипт не исполнится — политика заблокирует inline-код. Это защита в глубину: экранирование на входе, CSP как страховка.