Усиливая мой 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 ();
….
По сути, это то, что отправляет заголовок, я отредактировал его, чтобы сделать его простым и скрыть весь внешний контент.
Политика безопасности контента: base-uri ‘self’; 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’; стиль-Src
‘self’ ‘unsafe-inline’; обновить-небезопасные-запросы
Удаление этого исправляет ошибку …
<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>
Удаление всего внутри тега script, все еще вызывает ошибку. Хорошо, поскольку он вызывает метод GET, он устанавливает новые заголовки с новым одноразовым номером. Если бы у меня не было тегов script на странице GET, это не было бы проблемой. У меня есть неразрешимая проблема, так как контент динамический, хеш даже не будет работать.
Делая это на странице GET, позволяет заголовкам совпадать с одноразовым номером из запроса GET, но теперь при просмотре исходного кода ожидаемые несоответствующие однозначно отображаются. Что означает, что CSP все еще будет срабатывать.
<script nonce="' . Headers::getInstance()->getScriptHash() . '" type="text/javascript">
Я прошу прощения за длину этого поста. Я решил проблему, просто переписав код, чтобы в запросе GET не было встроенного скрипта. Это то, что вы должны делать в любом случае, и, вероятно, именно поэтому они разработали CSP для такой работы.
Если вся отображаемая разметка содержит те же одноразовые номера, что и заголовок CSP, она будет работать. Таким образом, существует вероятность того, что не все отображаемые одноразовые номера являются частью вашего заголовка. Поскольку вы упомянули в комментарии, что, по вашему мнению, это не должно быть проблемой, можно предположить, что в вашей разметке все еще присутствуют другие встроенные сценарии.
Вот что говорит Chrome:
Обратите внимание, что «unsafe-inline» игнорируется, если в списке источников присутствует значение хеша или одноразового номера.
Firefox должен сказать что-то вроде этого:
Политика безопасности содержимого: игнорирование «unsafe-inline» в script-src: указан nonce-source или hash-source
Поскольку у вас, очевидно, есть nonce-x
в списке источников unsafe-inline
директива будет игнорироваться. Поскольку у вас все еще есть эта директива, я могу только предположить, что у вас все еще есть другие встроенные сценарии, которые не используют одноразовый номер, который, вероятно, объясняет вашу ошибку.
Других решений пока нет …