CSP: script-src
CSP: script-src
Директива HTTP Content-Security-Policy (CSP) script-src определяет допустимые источники для JavaScript. Это включает не только URL-адреса, загружаемые непосредственно в элементы <script>, но и такие вещи, как обработчики событий встроенного сценария (onclick) и XSLT-стили, которые могут вызывать выполнение сценария.
| Версия CSP | 1 |
|---|---|
| Тип директивы | Директива Fetch |
default-src падение | Да. Если эта директива отсутствует, пользовательский агент будет искать директиву default-src . |
Синтаксис
Для политики script-src может быть разрешено одно или несколько источников:
Content-Security-Policy: script-src <source>; Content-Security-Policy: script-src <source> <source>;
Источники
<source> может быть любым из значений, перечисленных в Значения источников CSP.
Обратите внимание, что этот же набор значений может использоваться во всех директивах fetch (и в ряде других директив).
Примеры
Случай нарушения
Учитывая этот заголовок CSP:
Content-Security-Policy: script-src https://example.com/
следующий сценарий заблокирован и не будет загружен или выполнен:
<script src="https://not-example.com/js/library.js"></script>
Обратите внимание, что обработчики событий встроенного сценария также заблокированы:
<button id="btn" onclick="doSomething()"></button>
Вы должны заменить их вызовами addEventListener:
document.getElementById("btn").addEventListener("click", doSomething);
Встроенный небезопасный сценарий
Примечание: Запрещение встроенных стилей и встроенных сценариев — это одно из самых больших достижений в области безопасности, предоставляемых CSP. Однако, если вам абсолютно необходимо его использовать, существуют несколько механизмов, которые позволят это сделать.
Чтобы разрешить встроенные сценарии и встроенные обработчики событий, 'unsafe-inline', можно указать источник с номером или источником с хешем, который соответствует встроенному блоку.
Content-Security-Policy: script-src 'unsafe-inline';
Вышеприведенная политика безопасности контента позволит встроенным элементам <script>
<script> const inline = 1; // … </script>
Вы можете использовать источник с номером, чтобы разрешить только определенные встроенные блоки сценариев:
Content-Security-Policy: script-src 'nonce-2726c7f26c'
Вам нужно будет установить тот же номер в элементе <script>:
<script nonce="2726c7f26c"> const inline = 1; // … </script>
В качестве альтернативы, вы можете создавать хеши из своих встроенных сценариев. CSP поддерживает sha256, sha384 и sha512.
Content-Security-Policy: script-src 'sha256-B2yPHKaXnvFWtRChIbabYmUBFZdVfKKXHbWtWidDVF8='
При создании хеша не включайте теги <script>, и обратите внимание, что регистр и пробелы имеют значение, включая ведущие или хвостовые пробелы.
<script> const inline = 1; </script>
Небезопасные выражения eval
Выражение источника 'unsafe-eval' контролирует несколько методов выполнения сценариев, которые создают код из строк. Если у страницы есть заголовок CSP и 'unsafe-eval' не указан с директивой script-src, следующие методы заблокированы и не будут иметь никакого эффекта:
eval()Function()- При передаче строковой литералы в методы, такие как:
setTimeout("alert(\"Hello World!\");", 500); -
window.execScript()Нестандартный (только IE < 11)
Небезопасное выполнение WebAssembly
Выражение источника 'wasm-unsafe-eval' контролирует выполнение WebAssembly. Если у страницы есть заголовок CSP и 'wasm-unsafe-eval' не указан в директиве script-src, WebAssembly заблокирован от загрузки и выполнения на странице. Выражение источника 'wasm-unsafe-eval' более конкретно, чем 'unsafe-eval', которое разрешает как компиляцию (и инстанцирование) WebAssembly, так и, например, использование операции eval в JavaScript. Если ключевое слово 'unsafe-eval' используется, то это переопределяет любое вхождение 'wasm-unsafe-eval' в политике CSP.
Content-Security-Policy: script-src 'wasm-unsafe-eval'
strict-dynamic
Выражение источника 'strict-dynamic' указывает, что доверие, явно предоставленное сценарию, присутствующему в разметке, путем добавления к нему номеров или хешей, будет распространяться на все сценарии, загружаемые этим корневым сценарием. В то же время любые списки разрешений или выражения источников, такие как 'self' или 'unsafe-inline', будут игнорироваться.
Например, политика, такая как script-src 'strict-dynamic' 'nonce-R4nd0m' https://allowlisted.example.com/ , позволила бы загружать корневой сценарий с <script nonce="R4nd0m" src="https://example.com/loader.js"> и распространять это доверие на любой сценарий, загруженный loader.js, но не разрешать загрузку сценариев из https://allowlisted.example.com/ , если они не сопровождаются номером или не загружены из доверенного сценария.
Content-Security-Policy: script-src 'strict-dynamic' 'nonce-someNonce'
Или:
Content-Security-Policy: script-src 'strict-dynamic' 'sha256-base64EncodedHash'
Возможно развернуть strict-dynamic в обратной совместимости, без необходимости определения браузера. Политика:
Content-Security-Policy: script-src 'unsafe-inline' https: 'nonce-abcdefg' 'strict-dynamic'
будет действовать как 'unsafe-inline' https: в браузерах, поддерживающих CSP1, https: 'nonce-abcdefg' в браузерах, поддерживающих CSP2, и 'nonce-abcdefg' 'strict-dynamic' в браузерах, поддерживающих CSP3.
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | |
script-src |
25 |
14 |
23 |
Нет |
15 |
7 |
Да |
Да |
23 |
Да |
7 |
Да |
external_scripts |
59 |
≤79 |
Нет |
Нет |
46 |
Нет |
59 |
59 |
Нет |
43 |
Нет |
7.0 |
wasm-unsafe-eval |
97 |
97 |
102 |
Нет |
83 |
16 |
97 |
97 |
102 |
68 |
16 |
18.0 |
См. также
© 2005–2022 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src