XSS-плейграунд — как инъекция ломает форму
Введите «отзыв» с тегом <script> и посмотрите, как он исполняется в уязвимом режиме — и как экранирование и CSP его гасят.
В банке я закрываю формы от инъекций каждый день, и на собеседованиях вижу: XSS многие «знают теоретически». Хотелось демо, где инъекция реально срабатывает — безопасно, в песочнице.
Разница между `innerHTML` и `textContent` — это буквально разница между дырой и её отсутствием. А CSP — это второй рубеж: даже если экранирование где-то забыли, `script-src` без unsafe-inline не даст инъекции исполниться.
Само демо и есть контролируемая «поломка». Чтобы инъекция срабатывала по-настоящему, но не трогала основной сайт, пришлось вынести её в iframe с sandbox и отдельным, намеренно ослабленным CSP.
Три режима одной формы
Ниже — «форма отзыва», отрендеренная тремя способами. Введите payload (кнопка подставит классический <img onerror>) и переключайте режимы: уязвимый → экранированный → CSP. Демо живёт в изолированном sandbox-iframe, так что инъекция не может выйти за его пределы.
Что здесь важно
CSP-режим оставляет уязвимый innerHTML, но добавляет заголовок Content-Security-Policy: script-src 'self'. Даже вставленный скрипт не исполнится — политика заблокирует inline-код. Это защита в глубину: экранирование на входе, CSP как страховка.