javascript — Политика безопасности содержимого jQuery Load PHP Echo Nonce

Усиливая мой 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 для такой работы.

0

Решение

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

Вот что говорит Chrome:

Обратите внимание, что «unsafe-inline» игнорируется, если в списке источников присутствует значение хеша или одноразового номера.

Firefox должен сказать что-то вроде этого:

Политика безопасности содержимого: игнорирование «unsafe-inline» в script-src: указан nonce-source или hash-source

Поскольку у вас, очевидно, есть nonce-x в списке источников unsafe-inline директива будет игнорироваться. Поскольку у вас все еще есть эта директива, я могу только предположить, что у вас все еще есть другие встроенные сценарии, которые не используют одноразовый номер, который, вероятно, объясняет вашу ошибку.

0

Другие решения

Других решений пока нет …