CSP: отказался выполнять встроенный скрипт - PullRequest
4 голосов
/ 15 октября 2019

Что я делаю не так? По какой-то причине CSP в любом случае блокирует вызов файла js, хотя я указал одноразовый идентификатор в атрибуте.

<head>
    <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-Xiojd98a8jd3s9kFiDi29Uijwdu';">
</head>

Функция вызова:

jQuery.loadScript = function (url, callback) {

jQuery.ajax({
        url: url,
        dataType: 'script',
        success: callback,
        async: true,
        scriptAttrs: { nonce: "Xiojd98a8jd3s9kFiDi29Uijwdu" }
    });
}

$.loadScript("/js/temp.js");

Сообщение об ошибке:

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

* 10111012 * Jquery ver:
/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */

Отредактировано: если я не использую функцию $.loadScript, все js-файлы с установленным nonce attr работают ХОРОШО. Проблема в динамическом вызове файла js, но, к сожалению, я не могу от него избавиться. И его нужно загружать динамически.

Отредактировано (2): я пробовал через document.createElement ("script"), также через jQuery.globalEval и везде добавил nonce. Вывод получается так, что некоторые функции (одна из них использует foreach) не работают с ошибкой: Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'nonce-Xiojd98a8jd3s9kFiDi29Uijwdu'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution. Через консоль во вкладке «Сеть» я вижу загруженный скрипт.

Не работает -->

jQuery.globalEval($.loadScript("/js/temp.js"), {
    nonce: "Xiojd98a8jd3s9kFiDi29Uijwdu"
});

Не работать снова --->

var scriptTag = document.createElement("script");
scriptTag.type = "text/javascript";
scriptTag.src = "/js/temp.js";
scriptTag.setAttribute("nonce", "Xiojd98a8jd3s9kFiDi29Uijwdu");
(document.getElementsByTagName("head")[0] || document.documentElement).appendChild(scriptTag);

Если я удалю мета Content-Security-Policy - Все коды выше работают. Все скрипты работают как надо)

Ответы [ 2 ]

1 голос
/ 15 октября 2019

В текущей документации свойство для установки атрибутов тега сценария называется scriptAttrs.

scriptAttrs

Тип: PlainObject

Определяет объект с дополнительными атрибутами для использования в запросе «script» или «jsonp». Ключ представляет имя атрибута, а значение - значение атрибута. Если этот объект предоставлен, он заставит использовать транспортную метку script. Например, это можно использовать для установки одноразовых, целостных или перекрестных атрибутов для удовлетворения требований политики безопасности содержимого. (добавлена ​​версия: 3.4.0)

Предлагаю попробовать

jQuery.ajax({
        url: url,
        dataType: 'script',
        success: callback,
        async: true,
        scriptAttrs: { nonce: "Xiojd98a8jd3s9kFiDi29Uijwdu" }
    });
}
0 голосов
/ 15 октября 2019

Проблема была проста. Спасибо разработчикам jquery. Как оказалось, изначально все было ясно, но я просто этого не заметил, потому что мой код слишком большой. Проблема была в обработчиках onevent DOM, а в моем случае - в событии onclick в DIV.

<div onclick="setContent('content1')">1</div>
...