Одноразовая политика безопасности контента не применяется к атрибутам обработчика событий - PullRequest
1 голос
/ 31 мая 2019

Я в процессе добавления заголовков 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 и должен оставаться таким.

1 Ответ

1 голос
/ 31 мая 2019

Если есть способ использовать nonce для встроенного обработчика, я приму ответ, который демонстрирует это. К сожалению, на момент написания, я не думаю, что есть.

В качестве обходного пути следующий сценарий демонстрирует то же поведение и время, что и сценарий с async / defer и обработчиком загрузки, но при этом удовлетворяет указанной политике CSP:

<script nonce="d3adbe3fed">
    let s = document.createElement('script');
    s.src = 'https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js';
    s.onload = () => console.log(_.VERSION);
    document.documentElement.appendChild(s);
</script>

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

...