Я в процессе добавления заголовков CSP к сайту, которому предстоит пройти долгий путь, прежде чем он сможет принять строгую политику. Есть довольно много встроенных сценариев, поэтому я использую nonce-, чтобы разрешить определенные встроенные сценарии. Я обнаружил, что он не работает с атрибутом onload
тега script с src. Вот пример:
// header:
Content-Security-Policy: script-src self https: 'nonce-d3adbe3fed'
<script async defer src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js" nonce="d3adbe3fed" onload="console.log('onload', _.VERSION)"></script>
Полная рабочая демонстрация на https://brave -pasteur-0d438b.netlify.com /
Chrome выдает следующую ошибку:
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src self https: 'nonce-d3adbe3fed'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
Сообщение предполагает, что должна быть возможность включить встроенные обработчики событий с одноразовым номером, но, насколько я могу судить, одноразовый номер предназначен только для работы со встроенными сценариями.
Это всего лишь демонстрация, но сценарий использования - это сценарий асинхронного / отложенного отслеживания, который загружает библиотеку отслеживания, а затем в обработчике onload
выполняет отслеживание вызова загруженной библиотеки.
Можно ли использовать одноразовый номер для onload
или другого атрибута обработчика событий, или мне нужно будет изменить мою реализацию? Использование script-src 'unsafe-inline'
или script-src-attr 'unsafe-inline'
не вариант, так как это уязвимости, которые я специально пытаюсь устранить. И помещать содержимое обработчика onload
в отдельный сценарий, следующий за тегом script, также не вариант, поскольку сценарий async deferred
и должен оставаться таким.