Расширение поддерживаемых хешей в script-src

Карлос Хоан Рафаэль Ибарра Лопес
Carlos Joan Rafael Ibarra Lopez
Мустафа Эмре Асер
Mustafa Emre Acer

Опубликовано: 17 ноября 2025 г.

Начиная с версии Chrome 141, вы можете присоединиться к пробной версии Origin, чтобы протестировать новые функции политики безопасности контента (CSP), которые Chrome представляет. Эти функции помогают веб-сайтам защищаться от XSS, добавляя в разрешённый список известные источники JavaScript. Добавление в разрешённый список известных источников JavaScript и блокировка всех остальных источников — эффективный способ предотвращения XSS. Внедрённый злоумышленником JavaScript не будет попадать в разрешённый список и, следовательно, будет заблокирован.

Без этих функций сложно реализовать «строгий» CSP, который добавляет все источники JavaScript в белый список, не имея механизма связи nonce между хостом скрипта и сайтом или не зная заранее полный хеш скрипта. Оба этих метода сложно реализовать, если скрипт часто меняется и размещается на доверенной, но независимой сторонней платформе. Кроме того, если какой-либо скрипт должен использовать eval, CSP в настоящее время требует внесения eval в белый список для всех скриптов, что значительно ослабляет защиту.

Мы пытаемся устранить этот пробел, предоставляя более надёжный механизм для создания разрешённых списков URL-адресов скриптов в script-src и механизм для создания разрешённых списков вызовов eval. Вы сможете использовать существующий механизм хеширования в script-src для создания разрешённых списков URL определённых скриптов и JavaScript-кода, передаваемого в eval (и другие функции, подобные eval). Хотя создание разрешённых списков URL-адресов, возможно, не так строго, как CSP на основе целостности, этот механизм должен стать значительным улучшением по сравнению с существующим разрешённым списком имён хостов.

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

Варианты использования

Разрешить использование определенных URL-адресов с помощью script-src

Сайты, желающие добавить определённые скрипты в разрешённый список для использования с script-src, в настоящее время имеют два варианта: добавить содержимое скриптов в разрешённый список с помощью параметра целостности подресурсов (SRI) или использовать host-source для добавления имён хостов в разрешённый список. SRI часто непрактичен для часто изменяемых скриптов (например, аналитических скриптов). Указание host-source будет игнорироваться, если также задано значение strict-dynamic , и не обеспечивает полной защиты, поскольку не включает параметры URL. Это изменение позволит добавлять скрипты в разрешённый список, используя хэш их (полного) URL, поддерживая как динамические скрипты, так и конфигурации с использованием strict-dynamic .

Разрешить использование определенных скриптов с функциями eval или eval-подобными функциями

Некоторым сайтам требуется использование eval или eval-подобных функций (передача кода в виде строковых литералов в setTimeout , setInterval и setImmediate ). Для этих сайтов единственным доступным вариантом CSP является unsafe-eval , который разрешает все вызовы eval. Мы добавляем механизм для создания списка разрешенных входных данных для eval. Этот новый механизм позволяет узко ограничивать список разрешенных скриптов, напрямую хешируя их содержимое, вместо того, чтобы принуждать к предоставлению слишком широкого CSP unsafe-eval .

Начать

Чтобы опробовать поддержку хеширования скриптов и eval, присоединитесь к URL-адресу и хешам eval в пробной версии CSP script-src origin , работающей с Chrome 141 по 144.

Добавить хеши в script-src

URL-адреса добавляются в разрешённый список путём добавления значения в директиву CSP script-src в виде url-<hash-algorithm>-<script-url-hash> . Это разрешит выполнение любого контента, обслуживаемого этим URL, независимо от его содержания. Хеш должен включать только начальный URL-адрес (URL, указанный на странице), а не любой URL-адрес, на который этот URL перенаправляет. Поддерживаются как абсолютные, так и относительные URL-адреса.

Например, следующий заголовок CSP добавит в список разрешенных скриптов, обслуживаемых по адресу https://example.com/example.js :

Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';

где 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' — это хэш sha256 для ' https://example.com/example.js '.

Скрипты, оцениваемые с помощью eval или new Function можно добавить в разрешённый список, добавив eval-<hash-algorithm>-<script-contents-hash> в script src. Например, следующий заголовок CSP разрешит передачу строки alert("hello world") в eval() :

Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';

где 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' — это хэш sha256 alert("hello world") .

Чтобы способствовать быстрому внедрению, когда сайт подключается к пробной версии Origin, хэши URL-адресов и eval выводятся в консоль DevTools и включаются в отчёты CSP. Это означает, что для перечисления всех хэшей, необходимых для внесения в разрешённый список, можно использовать строгую политику, предусматривающую только report-only .

Поддерживать обратную совместимость

Чтобы разрешить развёртывание этих политик до того, как все браузеры добавят их поддержку, хэши URL можно указывать после разрешённых списков на основе хостов. Браузеры, которые распознают новые типы хэшей, будут игнорировать предыдущие разрешённые списки на основе хостов, в то время как браузеры, не распознающие новые типы хэшей, по-прежнему будут применять разрешённый список на основе хостов, что позволяет сайтам устанавливать обе политики, используя более строгую политику в браузерах, которые её поддерживают, без риска сбоев в браузерах, которые её не поддерживают, как показано в следующем примере.

Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

Мы также ввели политику strict-dynamic-url, эквивалентную strict-dynamic, которая применяется только при заданных хешах URL. Поскольку strict-dynamic игнорирует разрешённые списки на основе хостов, сайт, желающий добавить определённый хеш в разрешённый список и применять к нему строгую динамическую политику, может использовать следующую политику:

Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='

В этом примере браузеры, которые ещё не поддерживают хеши, будут применять только https: Аналогично, unsafe-eval будет игнорироваться поддерживающими браузерами при наличии хешей eval. Например, следующая политика будет оценена как unsafe-eval . Это разрешает любое использование eval() в браузерах, которые ещё не поддерживают хеши eval, при этом eval() для alert("hello world") будет разрешен только в браузерах, поддерживающих хеши eval.

  Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"

Поделитесь отзывом

Нам интересно получить отзывы от разработчиков об этих расширениях script-src . Оставляйте любые комментарии в формате issue в разделе Explainer на GitHub .