На главную

Безопасность

Анализ CSP

Разбирает готовую политику по директивам и показывает, где она не защищает: unsafe-inline, звёздочки, забытый base-uri.

Можно вставить вместе с именем заголовка — оно отрежется.

Оценка

F

2 из 100

Серьёзных дыр

3

Предупреждений

4

Директив в политике

4

Что нашлось

'unsafe-inline' в script-src

script-src

Любой встроенный скрипт выполняется — это ровно то, от чего защищает CSP. Замените на nonce или хеш.

'unsafe-eval' в script-src

script-src

Разрешает eval, конструктор Function и setTimeout со строкой. Обычно тянется за старой библиотекой шаблонов.

object-src разрешает больше, чем 'none'

object-src

Через <object> и <embed> обходят ограничения на скрипты.

base-uri не задан

base-uri

Внедрённый тег <base> переписывает все относительные адреса страницы, включая пути к скриптам. Нужен base-uri 'self' или 'none'.

frame-ancestors не задан

frame-ancestors

Страницу можно встроить в чужой iframe — это кликджекинг. X-Frame-Options закрывает то же самое, но хуже.

form-action не задан

form-action

Внедрённая форма отправит данные на чужой сервер.

'unsafe-inline' в style-src

style-src

Встроенные стили опаснее, чем кажется: через них вытаскивают токены из разметки. Но убрать их обычно тяжело — это меньшее из зол.

Нет upgrade-insecure-requests

Директива сама переписывает http-ссылки на https — дешёвая страховка от смешанного содержимого.

Директивы по порядку

ДирективаИсточникиИзвестна
default-src'self'да
script-src'self' 'unsafe-inline' 'unsafe-eval' https://cdn.example.comда
style-src'self' 'unsafe-inline'да
img-src*да

Как могло бы быть

Уже разрешённые источники сохранены, недостающие директивы добавлены. Значение {RANDOM} сервер обязан менять на каждый ответ.

default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src *; connect-src 'self'; font-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self'; upgrade-insecure-requests

Что CSP не умеет

Политика ограничивает, откуда браузер берёт код и данные, — но не проверяет, что делает разрешённый скрипт. Если в список внесён сторонний домен аналитики, взлом этого домена обойдёт всю политику. Отсюда и рекомендация вместо списка доменов использовать одноразовый nonce вместе с 'strict-dynamic': тогда доверие получают только те скрипты, которые вы разметили сами.