Gernar
Frontend DeveloperБезопасность

Интервью-вопрос

Что такое CSP

CSP помогает браузеру блокировать неразрешенные ресурсы и снижает риск выполнения вредного JavaScript. Для фронтенда важно понимать директивы, внедрение через заголовки и риск поломки UI при неправильной политике.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше коротко объяснить CSP на интервью?

Вы хотите ответить без лишней лекции, но с практическим смыслом.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

CSP отвечает на вопрос: какие ресурсы эта страница имеет право использовать. Браузер получает политику вместе с HTML и применяет ее к загрузке скриптов, стилей, изображений, шрифтов, iframe и сетевых соединений.

Короткий ответ может звучать так:

CSP это политика безопасности, которая ограничивает источники ресурсов на странице. Она особенно полезна против XSS, потому что может заблокировать выполнение скрипта, который не пришел из разрешенного источника или не имеет разрешенного nonce/hash.

Важно не сказать лишнего. CSP не делает приложение безопасным автоматически. Если код вставляет пользовательский HTML через innerHTML, проблема все равно остается. CSP просто добавляет дополнительный слой защиты.

Как это выглядит на практике

Типичная политика задается HTTP-заголовком:

Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; connect-src 'self' https://api.example.com; object-src 'none'; base-uri 'self'

Здесь default-src 'self' задает базовое ограничение, script-src разрешает JS только с текущего origin и конкретного CDN, connect-src разрешает запросы к своему API, а object-src 'none' закрывает старые встраиваемые объекты.

Практический риск для фронтенда простой. Если забыть connect-src для API, приложение может отрендериться, но данные не загрузятся. Если забыть CDN для шрифтов или картинок, пользователь увидит сломанный интерфейс. Поэтому CSP надо тестировать как часть продукта, а не только как настройку сервера.

Nonce, hash и опасность unsafe-inline

Самая частая ловушка, inline-скрипты. Строгая CSP обычно не хочет выполнять произвольный inline-код, потому что именно так часто проявляется XSS. Быстрое, но слабое решение, добавить 'unsafe-inline'. На интервью лучше сказать, что это снижает пользу CSP и должно быть исключением.

Более безопасный вариант для конкретного inline-скрипта, nonce:

<script nonce="r4nd0m-value-from-server">
  window.__APP_CONFIG__ = { apiUrl: "https://api.example.com" };
</script>

И соответствующая часть заголовка:

Content-Security-Policy: script-src 'self' 'nonce-r4nd0m-value-from-server'

В реальном приложении nonce должен быть случайным и новым для каждого HTTP-ответа. Не надо хардкодить его как постоянную строку. Если в inline-скрипт попадает состояние из пользователя или CMS, его нужно безопасно сериализовать и экранировать. Иначе CSP может не спасти от XSS, а UI получит выполнение чужого кода еще до гидратации. Hash работает иначе. Браузер разрешает inline-фрагмент, если его содержимое совпадает с указанным хешем. Это удобно для стабильного кода, но плохо подходит для динамического содержимого.

Как выбирать настройки без поломки продукта

Как рассуждать на интервью

1Нужно внедрить CSP без риска для продакшена?
Начните с <code>Content-Security-Policy-Report-Only</code> и собирайте нарушения.
2Ломаются inline-скрипты, но они действительно нужны?
Используйте nonce для динамического HTML или hash для стабильного фрагмента, а не <code>'unsafe-inline'</code>.
3Приложение ходит к API, WebSocket или аналитике?
Проверьте <code>connect-src</code>. Иначе запросы могут блокироваться без очевидной ошибки в коде приложения.
4Есть сторонние виджеты или iframe?
Ограничьте их через <code>frame-src</code> и разрешайте только конкретные домены.
5Есть формы, которые отправляют данные наружу?
Проверьте <code>form-action</code>, чтобы форма не могла незаметно уйти на чужой endpoint.

Хороший ответ не заканчивается списком директив. Покажите, что вы думаете о rollout. Для существующего проекта безопаснее включить Content-Security-Policy-Report-Only, собрать отчеты о нарушениях, уточнить список разрешенных источников и только потом включать блокирующий режим.

Если сразу включить строгую политику, можно получить не уязвимость, а продакшен-инцидент. Не открывается оплата, не грузится карта, не работает чат поддержки, не уходят события аналитики, форма отправляется не туда или не отправляется вообще. Это не значит, что CSP не нужна. Это значит, что ее надо внедрять по шагам.

Что особенно важно для фронтенда

Где CSP чаще всего влияет на UI

Скриптыscript-src

Определяет, какой JavaScript можно загрузить и выполнить. Слишком широкое правило ослабляет защиту от XSS.

API-запросыconnect-src

Влияет на fetch, XHR, WebSocket и EventSource. Ошибка здесь ломает данные в интерфейсе.

Стилиstyle-src

Может заблокировать CSS или inline-стили. Не стоит автоматически лечить это через <code>'unsafe-inline'</code>.

Картинки и шрифтыimg-src, font-src

Ошибки видны как битые изображения, пустые иконки или неверная типографика. При этом JS может работать нормально.

Iframe и формыframe-src, form-action

Ошибки могут сломать оплату, карту, чат или отправку формы. Слишком широкие правила повышают риск встраивания чужого виджета или отправки данных не туда.

Отчетыreport-uri, report-to

Помогают увидеть реальные нарушения политики до включения блокировки и после релиза.

На стороне фронтенда CSP часто проявляется как странная ошибка в браузерной консоли. Код выглядит правильным, но ресурс заблокирован политикой. Поэтому при отладке нужно смотреть не только Network и логи API, но и сообщения вида "Refused to load" или "Refused to connect".

Сильная формулировка на интервью:

Я воспринимаю CSP как контракт между серверной настройкой и фронтендом. Фронтенд должен знать, какие CDN, API, iframe, шрифты и аналитика реально нужны, иначе политика будет либо слишком слабой, либо будет ломать пользовательские сценарии.

Чем CSP отличается от похожих механизмов

CSP часто путают с CORS. CORS контролирует, может ли страница из одного origin прочитать ответ другого origin. CSP контролирует, какие ресурсы страница может загружать, выполнять и к каким адресам подключаться.

Например, API может разрешать CORS для вашего домена, но запрос все равно будет заблокирован, если CSP не разрешает этот API в connect-src. И наоборот: наличие адреса в connect-src не означает, что сервер отдаст ответ с нужными CORS-заголовками.

Практический вывод

Если вас спрашивают "Что такое CSP", отвечайте в три шага. Сначала определение: политика браузера для ограничения источников ресурсов. Потом польза: снижает риск выполнения вредного кода, особенно при XSS. Потом практика: задается заголовком, строится вокруг директив, внедряется осторожно через report-only, nonce/hash и проверку реальных ресурсов приложения.

Не обещайте абсолютную безопасность. Лучший ответ показывает баланс. Строгая политика полезна, но ее нужно настроить так, чтобы она защищала пользователей и не ломала интерфейс.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Обещать полную защиту от XSS

    CSP не исправляет уязвимый код и не отменяет экранирование пользовательского ввода. Если React-компонент вставляет чужой HTML через dangerouslySetInnerHTML или прямой innerHTML, уязвимость остается. На интервью лучше сказать, что CSP снижает риск выполнения внедренного кода и ограничивает последствия атаки.
  2. 2

    Оставлять <code>'unsafe-inline'</code> без причины

    Такая настройка разрешает inline-скрипты и часто убирает один из главных защитных эффектов CSP. Если inline-код нужен, лучше обсудить nonce, hash или вынос кода во внешний файл.
  3. 3

    Путать CSP и CORS

    CORS решает, может ли один origin читать ответ другого origin. CSP решает, какие ресурсы страница может загружать и выполнять. На интервью это разные механизмы. Если вы смешиваете их в один ответ, выглядит так, будто вы плохо понимаете браузерную безопасность.
  4. 4

    Включать строгую политику сразу в блокирующем режиме

    Так легко сломать CDN, аналитику, шрифты, оплату или запросы к API. Безопаснее начать с Content-Security-Policy-Report-Only, собрать нарушения и постепенно ужесточать правила.
  5. 5

    Разрешать слишком широкие источники

    Правила вроде * или целого домена без необходимости могут пропустить вредный скрипт, картинку-трекер или подключение к чужому endpoint. Лучше разрешать конкретные origin и регулярно проверять, что они еще нужны.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание CSP, XSS и браузерных ограничений.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание