Chrome 18+: как разрешить встроенные скрипты с политикой безопасности контента?

Chrome 18 Dev / Canary только что был выпущен, а content_security_policy потребуется в манифесте для определенных расширений.

Я пытаюсь заставить CSP работать для встроенных скриптов, но я не знаю, что я делаю что-то неправильно или это ошибка Chrome 18.

manifest.json:

 { "name": "CSP Test", "version": "1.0", "manifest_version": 2, "options_page": "test.html", "content_security_policy": "default-src 'unsafe-inline'" } 

test.html:

   alert("hello");   

В Chrome 18 это распакованное расширение не загружается, отображая ошибку:

Не удалось загрузить расширение из «[каталога расширений]». Недопустимое значение для 'content_security_policy'.

Если я изменю 'unsafe-inline' на 'self' , расширение будет загружено нормально, но alert() не работает, а консоль страницы параметров содержит ошибку:

Отказано от выполнения встроенного скрипта из-за политики безопасности контента.

В Chrome 16, используя 'unsafe-inline' функция увеличения и alert() . Тем не менее, в Chrome 16 замена 'unsafe-inline' на 'foo' позволяет загружать расширение, но, конечно же, не работает alert() , поэтому, возможно, Chrome 18 более строг, чем 16, но …

Является ли default-src 'unsafe-inline' фактически недействительным, или это ошибка? Какое значение CSP можно использовать для создания функции alert() в Chrome 18?


Основываясь на принятом ответе ниже, встроенные скрипты больше не работают в расширениях в Chrome 18. alert() необходимо поместить в свой собственный файл JavaScript.

Для последних версий Chrome (46+) текущий ответ больше не верен. unsafe-inline все еще не имеет эффекта (в тегах манифеста и в meta ), но в документации вы можете использовать описанную здесь методику, чтобы уменьшить ограничение.

Использование хеша для элементов

Директива script-src позволяет разработчикам присваивать белый список конкретному встроенному скрипту, указывая его hash как разрешенный источник сценария.

Использование прост. Сервер вычисляет хеш содержимого конкретного блока сценария и включает в себя кодировку base64 этого значения в заголовке Content-Security-Policy :

 Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com 'sha256-base64 encoded hash' 

пример

Рассмотрим следующее:

manifest.json :

 { "manifest_version": 2, "name": "csp test", "version": "1.0.0", "minimum_chrome_version": "46", "content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='", "background": { "page": "background.html" } } 

background.html :

        

Результат :
диалоговое окно предупреждения из встроенного скрипта

Дальнейшее расследование

Я также тестировал установку применимой директивы в meta вместо манифеста. Хотя CSP, указанный в сообщении консоли, включал содержимое тега, он не выполнил встроенный скрипт (в Chrome 53).

new background.html :

          

Результат :
консольные сообщения об ошибках безопасности содержимого

Приложение: Генерация hashей

Вот два метода генерации hashей:

  1. Python (передайте JS на stdin, пропустите его где-нибудь еще):
 import hashlib import base64 import sys def hash(s): hash = hashlib.sha256(s.encode()).digest() encoded = base64.b64encode(hash) return encoded contents = sys.stdin.read() print(hash(contents)) 
  1. В JS, используя библиотеку Crypto для Stanford Javascript :
 var sjcl = require('sjcl'); // Generate base64-encoded SHA256 for given string. function hash(s) { var hashed = sjcl.hash.sha256.hash(s); return sjcl.codec.base64.fromBits(hashed); } 

Убедитесь, что при hashировании встроенных скриптов включено все содержимое тега скрипта (включая все ведущие / завершающие пробелы). Если вы хотите включить это в свои сборки, вы можете использовать что-то вроде cheerio для получения соответствующих разделов. Как правило, для любого html вы можете:

 var $ = cheerio.load(html); var csp_hashes = $('script') .map((i, el) => hash($(el).text()) .toArray() .map(h => `'sha256-${h}'`) .join(' '); var content_security_policy = `script-src 'self' 'unsafe-eval' ${csp_hashes}; object-src 'self'`; 

Это метод, используемый в hash-csp , плагин gulp для генерации hashей.

Следующий ответ верен для более старых версий Chrome (<46). Для более поздних, пожалуйста, проверьте @ Chris-Hunt ответ https://stackoverflow.com/a/38554505/422670

Я просто разместил очень похожий ответ на вопрос https://stackoverflow.com/a/11670319/422670

Как уже было сказано, нет способа ослабить встроенную политику безопасности в расширениях v2 . unsafe-inline просто не работает, намеренно.

Нет никакого другого пути, кроме как перемещать все ваши javascript в js-файлы и указывать на них с помощью .

Тем не менее, есть возможность делать Eval и новую функцию внутри изолированного iframe, например, со следующими строками в манифесте:

 "sandbox": { "pages": [ "page1.html", "directory/page2.html" ] }, 

Песочница не будет иметь доступа к API расширения или приложения или к непосредственному доступу к страницам без песочницы (они могут связываться с ними через postMessage ()). Вы можете дополнительно ограничить права на песочницу специальным CSP

В настоящее время есть полный пример из команды Google Chrome в github eval в iframe о том, как обойти проблему, обмениваясь информацией с изолированным iframe, а также небольшим учебным пособием по аналитике

Благодаря Google, в линейке много редизайна расширения 🙁

РЕДАКТИРОВАТЬ

Можно устранить политику безопасности для REMOTE-скриптов. Но не для строк.

Политика против eval() и ее родственников, таких как setTimeout(String) , setInterval(String) и new Function(String) можно смягчить, добавив в вашу политику 'unsafe-eval' : "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

Однако мы настоятельно рекомендуем не делать этого. Эти функции являются известными векторами атаки XSS.

это появилось в документации по багажнику и обсуждается в streamе «eval re-allowed»

inline scripts не вернутся:

Не существует механизма ослабления ограничения на выполнение встроенного JavaScript. В частности, установка политики сценария, которая включает в себя 'unsafe-inline' будет иметь никакого эффекта.

Использование хеша для встроенных скриптов разрешено в Уровне безопасности контента 2. Из примера в спецификации:

Content-Security-Policy: script-src ‘sha512-YWIzOWNiNzJjNDRlYzc4MTgwMDhmZDlkOWI0NTAyMjgyY2MyMWJlMWUyNjc1ODJlYWJhNjU5MGU4NmZmNGU3OAo =’

Альтернативой является nonce , опять же из примеров:

Content-Security-Policy: script-src ‘self’ ‘nonce- $ RANDOM’;

тогда

   

Они отображаются в Chrome 40+, но я не уверен, какая удача была бы у других браузеров на данный момент.

Афаик, это ошибка.

 "default-src 'self' https://ssl.google-analytics.com" 

работает, пока

 "default-src 'self' http://ssl.google-analytics.com" 

оленья кожа.

Это действительно технологические технологии, проверьте http://code.google.com/p/chromium/issues/detail?id=105796 .

Обновление: http://code.google.com/p/chromium/issues/detail?id=107538 ссылается на эту проблему.

  • хром-скрипты контента и newtab
  • Как я могу заставить XSLT работать в хроме?
  • Как использовать отладчик сети chrome с переадресацией
  • Поскольку v38, расширение Chrome больше не может загружаться с URL-адресов HTTP, обходной путь?
  • Удалите синюю рамку из кнопки css custom-styleled в Chrome
  • Внедрить HTML в страницу из сценария содержимого
  • Увеличение максимального количества подключений Google Chrome на сервер до более чем 6
  • Что означает == $ 0 (double equals dollar zero) в инструментах разработчика Chrome?
  • chrome.tabs возвращает undefined в скрипте содержимого
  • Как загрузить CRX-файл из интернет-магазина Chrome для данного ID?
  • Запретить API-интерфейс chrome.notifications скрывать мое уведомление через несколько секунд
  • Interesting Posts

    Вставить изображение в ячейку excel

    Почему нет дженериков в Go?

    Наиболее общее ограничение высшего порядка, описывающее последовательность целых чисел, упорядоченных относительно отношения

    Можно ли запустить рабочий процесс Automator при подключении USB-устройства?

    Что означает основной конец ассоциации в соотношении 1: 1 в структуре Entity

    как проверить токен доступа к facebook?

    В чем разница между запуском @powershell и powershell (любая команда с @ на передней панели)?

    __builtin_prefetch, сколько он читает?

    В Matlab можно ли завершить скрипт, но сохранить все его внутренние переменные в рабочее пространство?

    Подключите светодиодный ЖК-дисплей Apple 24 "к ПК

    Почему следует избегать кастинга?

    Может ли schroot разрешать перезаписывать файлы конфигурации в домашнем каталоге?

    В чем смысл classа Option ?

    Jqgrid 3.7 не показывает строки в Internet Explorer

    Написание DLL в C / C ++ для .Net-совместимости

    Давайте будем гением компьютера.