Политика безопасности содержимого jQuery Load PHP Echo Nonce - PullRequest
0 голосов
/ 28 октября 2018

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

1 Ответ

0 голосов
/ 29 октября 2018

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...