Как выполнять встроенные сценарии, полученные из запроса JQuery Ajax, когда в php включена защита контента - PullRequest
0 голосов
/ 11 февраля 2019

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

header("Content-Security-Policy: script-src 'nonce-".$nonce."';");

и т. Д. На странице в мои теги сценариев вставлен одноразовый номер в следующем виде:

<script nonce="<?php echo $nonce; ?>" src="/static/js/global.js"></script>

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

<script nonce="<?php echo $nonce; //the same nonce as before ?>"></script>

Одноразовый номер генерируется и сохраняется на основе сеанса, поэтому каждый из тегов сценария в запросе ajax должен иметь тот же одноразовый номер, что и исходная страница, но по какой-то причине я получаю эту ошибку в chromeconsole:

jquery.min.js: 2

Отказано в выполнении встроенного сценария, поскольку оно нарушает следующую директиву политики безопасности содержимого: "script-src 'nonce-YTQ4NTU4NzU1YTlkZGY5MmYzNDZlMTc0iTkh,Либо ключевое слово unsafe-inline, хэш ('sha256-88nUYsb1c + aRY8mvRZ5hGPAkvH3REgfxFMQa6iIP4GY ='), либо одноразовый номер ('nonce -...') требуется для включения встроенного выполнения.

*Как мне сделать так, чтобы теги скрипта, загруженные через запрос ajax, также выполнялись.

1 Ответ

0 голосов
/ 15 февраля 2019

Я выяснил причину для всех, кто столкнется с этой проблемой в будущем.Это связано с тем, как работают теги сценария и как их добавляет JQuery.При использовании функций .append () или .html () JQuery начнет с добавления тега script, но сразу после этого браузер проверит новый тег script на наличие одноразового номера.Поскольку JQuery не добавляет одноразовый номер в качестве атрибута до добавления тега сценария, этот новый тег сценария теперь отключается браузером за отсутствие одноразового номера при его создании.Обходной путь должен был сделать мою собственную функцию, чтобы добавить сценарии, которые работают следующим образом:

//create a script tag node
let node = document.createElement("script"); 

//this is the element where the script will get appended
let vr = document.getElementById("change-region"); 

//insert your nonce here from wherever you retrieve it from
let nonce = "sd234r8hf8wresiu"; //insert your nonce here from wherever you get your nonce

//add the nonce to the new script node we made
node.setAttribute("nonce", nonce); 

//add the source of your script
node.setAttribute("src", "/source/of/script");

//append the node of the script element and it should be accepted by the browser this time
vr.appendChild(node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...