zkrvndm
@zkrvndm
Архитектор решений

Почему не работает директива unsafe-inline в расширении для Google Chrome?

Прописал в manifest.js своего расширения все необходимые разрешения:
"content_security_policy": "script-src 'self' 'unsafe-inline' 'unsafe-eval'"

Однако, по прежнему не могу вставлять скрипты на страницах расширения инлайново. Текст ошибки:
5f783999a1dea047321432.png
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'". Either the 'unsafe-inline' keyword, a hash ('sha256-zeYLOGjDUEFNfFuC62JDSnYb6MFW4QnA1/5JWQZ9d8Y='), or a nonce ('nonce-...') is required to enable inline execution.


Подскажите, как мне правильно настроить Content Security Policy для страниц моего расширения?
Чтобы можно было свободно вставлять любые скрипты именно инлайново:
var script = document.createElement('script');
script.innerHTML = 'Произвольный JavaScript-код';
document.head.appendChild(script);

Меня не интересует вставка ссылки на скрипт или его выполнение через eval, хочу разобраться именно с unsafe-inline!
Что я уже пробовал делать
Я предвижу ваши возражения, мол научись читать ошибки. Однако, разумеется я первым делом попробовал использовать атрибут nonce для вставляемых скриптов, но увы, мне это не помогло:
"content_security_policy": "script-src 'self' 'unsafe-inline' 'unsafe-eval' 'nonce-Xiojd98a8jd3s9kFiDi29Uijwdu'"

var script = document.createElement('script');
script.setAttribute('nonce', 'Xiojd98a8jd3s9kFiDi29Uijwdu');
script.innerHTML = 'Произвольный JavaScript-код';;
document.head.appendChild(script);

Это не решило проблему и Chrome продолжает выдавать ту же саму ошибку.
  • Вопрос задан
  • 2524 просмотра
Решения вопроса 1
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Спустя час поисков нашел ответ на свой вопрос:
...установка политики, которая включает «unsafe-inline», не будет иметь никакого эффекта.

Начиная с Chrome 46, встроенные скрипты можно добавить в белый список, указав в политике хэш исходного кода в кодировке base64. Этот хэш должен иметь префикс используемого алгоритма хеширования (sha256, sha384 или sha512).

Другими словами на страницах расширения в принципе нельзя никак применить политику unsafe-inline.
Всегда будет выдавать ошибку:
'content_security_policy': Ignored insecure CSP value "'unsafe-inline'" in directive 'script-src'.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы