Укрепляя мой CSP, удаляя все небезопасные встроенные сценарии, предоставляя им одноразовые номера, я столкнулся с проблемой на определенной странице моего сайта.Я отредактировал все, чтобы было проще понять его в мелкомасштабном сценарии.
product.php загружает шаблон, для которого будет отображаться продукт.
<div id="productDisplay"></div>
<script nonce="sampleCorrectNonce" type="text/javascript">
product();
</script>
product.php? Id =123 загружает фактические данные о продукте и нуждается в обновлении новой информации по различным сценариям.
if ($_GET['action'] === 'displayProduct') {
echo '
samleData
<script nonce="sampleCorrectNonce" type="text/javascript">
productReady();
productOptions();
</script>
';
}
В product.php есть исходный код javascript, который запускает и загружает product.php? Id = 123 вDIV по идентификатору.
product = function() {
$("#productDisplay").load("//"+ document.domain + "/shop/product.php?action=displayProduct&id=123");
}
Одноразовый номер был создан, чтобы разрешить CSP для встроенных сценариев.Несмотря на то, что одноразовый номер точно совпадает и представлен на той же странице встроенным, он все равно вызывает ошибку.
<html>
<body>
<div id="productTemplateStuffa"></div>
<div id="productDisplay">
samleData
<script nonce="sampleCorrectNonce" type="text/javascript">
productReady();
productOptions();
</script>
</div>
<div id="productTemplateStuffb"></div>
<script nonce="sampleCorrectNonce" type="text/javascript">
product();
</script>
</body>
</html>
По какой-то причине я не могу понять, как включить PHP-эхо-контентот загрузки jQuery в DIV, сохраняя при этом CSP счастливым.
Ошибка консоли Firefox:
Политика безопасности содержимого: настройки страницы заблокировали загрузку ресурса в себя («script-src»https://example.loc/ 'nonce-sampleCorrectNonce' 'unsafe-inline' 'unsafe-eval' ”).Источник: productReady ();....
Это по сути то, что отправляет заголовок, я отредактировал его, чтобы сделать его простым и скрыть весь внешний контент.
Content-Security-Policy: base-uri 'я';default-src 'self';connect-src 'self';font-src 'self';форма-действие «я»;фрейм-предки «нет»;img-src 'self' data :;media-src 'none';object-src 'none';script-src 'self' https://example.loc/ 'nonce-sampleCorrectNonce' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline';upgrade-insecure-запросы
Удаление этого исправляет ошибку ...
<script nonce="sampleCorrectNonce" type="text/javascript">
productReady();
productOptions();
</script>
Это не исправляет ошибку ...
<script nonce="sampleCorrectNonce" type="text/javascript">
</script>
Вот как Chrome вверху и Firefox внизу отображают содержимое встроенного скрипта.
<script nonce="" type="text/javascript" src="https://example.loc/theme/assets/global.jquery.min.js?v=1540058004"></script>
<script nonce="sampleCorrectNonce" type="text/javascript" src="//example.loc/theme/assets/global.jquery.min.js?v=1540058004"></script>
Удаление всего содержимого внутри тега скрипта по-прежнему вызывает ошибку.Хорошо, так как он вызывает метод GET, он устанавливает новые заголовки с новым одноразовым номером.Если бы у меня не было тегов script на странице GET, это не было бы проблемой.У меня есть неразрешимая проблема, так как содержимое является динамическим, хеш даже не будет работать.
Делая это на странице GET, позволяет заголовкам совпадать с одноразовым номером из запроса GET, но теперь при просмотре исходного кода отображаются несоответствующиеОдноразовые, как и ожидалось.Это означает, что CSP все равно сработает.
<script nonce="' . Headers::getInstance()->getScriptHash() . '" type="text/javascript">
Я прошу прощения за длину этого поста.Я решил проблему, просто переписав код, чтобы в запросе GET не было встроенного скрипта.Это то, что вы должны делать в любом случае, и, вероятно, именно поэтому они разработали CSP для такой работы.