Политика безопасности контента множественный одноразовый номер

У меня есть одностраничное приложение (встроенное в .NET core MVC 2.2), где html-раздел загружается на лету.

В основном документе добавленная политика CSP с динамически генерируемым заголовком выглядит так:

Content-Security-Policy: script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'

Затем идет раздел страницы, загружаемый с помощью функции загрузки jquery ajax. Раздел страницы содержит скрипт (из src) с одноразовым значением. Раздел страницы, обслуживаемый с заголовком CSP, выглядит так:

Content-Security-Policy: script-src 'self' 'nonce-ci5TQsyidT8x2jwBLRHS'

все хорошо, кроме браузеров (хром, сафари блокирует скрипт), с сообщением:

jqueryscriptsbundle.js:formatted:43 Refused to execute inline script 
because it violates the following 
Content Security Policy directive: "script-src 'self' 'nonce-I64vb811BxRNGV9Xf0pM'

Итак, браузер сравнивает одноразовый номер скрипта, то есть ci5TQsyidT8x2jwBLRHS, со значением одноразового номера корневой / главной страницы I64vb811BxRNGV9Xf0pM, следовательно, скрипт заблокирован.

Это правильное поведение? Что я могу сделать, чтобы он заработал?


person SSA    schedule 14.01.2020    source источник


Ответы (1)


Ваш начальный CSP, загруженный со страницей, предоставляет одноразовый номер. Что вы пытаетесь сделать, так это добавить еще один одноразовый номер через Ajax после начальной загрузки страницы. CSP явно не допускает этого; это не ошибка - в этом весь смысл.

Что вы можете сделать, так это разрешить script-src strict-dynamic. Это позволяет вам авторизовать скрипт, и все, что загружено этим скриптом, также авторизуется. См. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src.

person Stephen R    schedule 14.01.2020
comment
Чтобы было ясно: может быть лучше связать скрипт с вашей главной страницы, чем загружать новые скрипты. менее безопасно использовать strict-dynamic; но, конечно, не так плохо, как unsafe-inline .... Внутри самой функции Ajax вы можете после загрузки связать существующие скрипты с новым контентом - person Stephen R; 15.01.2020
comment
Спасибо за заголовок, что вы имеете в виду, связывая существующий скрипт с новым контентом? Как бы Вы это сделали? - person SSA; 15.01.2020
comment
Вы знаете, как вы обычно связываете скрипты (например) с onclick событиями при загрузке страницы? Вы также можете сделать это как часть функции Ajax - добавить новый контент и затем связать скрипты с этим контентом. - person Stephen R; 15.01.2020
comment
Было бы сложно сделать. Строгая динамика не поддерживается в сафари. Спасибо - person SSA; 15.01.2020
comment
Дело в том, что если вы сделаете это таким образом, вам не понадобится strict-dynamic, потому что код находится на вашей главной странице, а не из содержимого Ajax. Ваш конкретный случай может не работать таким образом, но есть большая вероятность, что это может - person Stephen R; 15.01.2020
comment
Это правда, но я не понимаю, как связать часть, в лучшем случае я могу поместить метод Init во все js и вызвать метод init, в соответствии с модулем страницы, в качестве второго варианта, я думаю об использовании сеанса, чтобы сохранить тот же одноразовый номер за один сеанс. - person SSA; 15.01.2020