Ошибка" отказано в загрузке скрипта " в расширении chrome
Есть много вопросов, так похожих на этот, Однако ни один из них не решил мою цель.
Я создаю "pinterest", как расширение chrome. Он вводит скрипт на веб-страницу, собирает изображения и затем размещает их где-то. Все работает отлично, однако когда я запускаю это на самом pinterest, он дает мне эту ошибку:
Отказался загружать скрипт 'https://domain_name.com/my_script.js ' потому что это нарушает следующую безопасность контента Директива: "по умолчанию-ФОК 'самостоятельная' протокол HTTPS://.pinterest.com протокол HTTPS://.pinimg.com *.pinterest.com *.pinimg.com *.connect.facebook.net google.com .google-analytics.com протокол HTTPS://.googleapis.com .gstatic.com протокол HTTPS://.facebook.com *.facebook.com www.googleadservices.com googleads.g.doubleclick.net platform.twitter.com *.tiles.mapbox.com *.online-metrix.net *.БНК.ЛТ БНК.ЛТ *.yozio.com 'небезопасно-рядный' 'небезопасно-ивал'". Обратите внимание, что 'script-src' не был явно задан, поэтому "default-src" используется в качестве запасного варианта.
Я знаю, что это имеет много общего с Content Script Policy
(и я не знаю много об этом), однако я следовал этой и этой ссылке, которая дала мне достаточно информации о том, что такое CSP и как его использовать.
Я сделал все (то, что я думаю), что требуется, но это все еще не работает. Вот мой манифест.json
{
"manifest_version": 2,
"name": "Image Posting",
"description": "This extension enables you to post images",
"version": "1.0",
"browser_action": {
"name": "Image Posting"
},
"homepage_url": "https://www.domain_name.com/",
"background":{
"scripts":["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["jquery.js", "content.js"]
}
],
"icons": {
"128": "icon_128.png",
"16": "icon_16.png",
"48": "icon_48.png"
},
"permissions": [
"activeTab",
"notifications"
],
"web_accessible_resources": [
"icon_48.png"
],
"content_security_policy": "default-src 'self' https://domain_name.com/my_script.js; script-src 'self' https://domain_name.com/my_script.js; style-src 'self' https://domain_name.com/my_style.css; 'unsafe-inline' 'unsafe-eval'"
}
в какой-то момент я также подумал, что в этом может быть что-то, чего не может быть. на самом деле сделано, однако, я тогда попробовал расширение буфера, и он может успешно внедрить свой скрипт на pinterest, А это означает, что эта вещь каким-то образом возможна. Кроме того, не забывайте, что расширение, подобное AdBlocker, работает на каждом сайте, и они также должны вытягивать некоторые ресурсы с удаленного сервера. Они каким-то образом обходят CSP, или есть что-то действительно важное, чего я не знаю или пропустил. Любые предложения/советы о том, как это сделать?
3 ответа:
Без отключения CSP вы не сможете вводить скрипты, не включенные в белый список.
Скрипты расширения освобождаются от этого ограничения, поэтому разместите файл в пакете расширения, объявите его в
web_accessible_resources
и вы должны быть в состоянии запустить сценарий.var s = document.createElement('script'); s.src = chrome.extension.getURL('script.js'); // In web_accessible_resources (document.head || document.documentElement).appendChild(s); s.onload = function() { s.remove(); // Clean up, just to be nice. };
Есть 3 CSPs в игре в расширениях:
content_security_policy
директива применяется только к собственным страницам расширения (таким как фоновая страница). Если он не указан, то по умолчанию он равенscript-src 'self'; object-src 'self'
и имеет некоторые ограничения на то, как он может быть изменен.Контекст сценария содержимого не подчиняется этому CSP.
unsafe-eval
является неограниченным (так как вы можете сделатьexecuteScript
с произвольным кодом в любом случае), однако встроенные и удаленные ограничения скрипта просто не применяйте к скриптам содержимого, потому что:Любой скрипт в DOM страницы, будь то встроенный или тег
<script src="...">
, выполняется в контексте самой страницы и подчиняется CSP самой страницы. Есть точно одно исключение, вводя<script> /* code */ </script>
на странице обойдет ограничения встроенного кода для немедленного выполнения.То, что вы видите, по-видимому, является результатом попытки загрузить удаленный скрипт с помощью введение
<script src="https://domain_name.com/my_script.js">
в страницу. Это зависит от собственного CSP страницы и терпит неудачу.
Теоретически, вы можете повлиять на собственный CSP страницы, перехватывая и перехватывая заголовки ответов с помощью
webRequest
. Однако это не очень хороший подход: вы, как правило, вмешиваетесь в безопасность сторонней страницы. Никто не собирается быть счастливым об этом.То, что вы можете сделать, это загрузить скрипт на фоновой странице с помощью XHR, а затем либо:
Введите его в контекст скрипта содержимого с помощью
chrome.tabs.executeScript({code: ...})
, который не подчиняется CSP страницы;Передайте его контекстному скрипту, чтобы он мог быть введен на страницу, добавив
<script>...</script>
к DOM, который обходит CSP страницы, пока он не нарушает его далее (загружая больше сценариев или используя eval/встроенный код).P.S.: Как предполагает Роб У, Если вы планируете это сделать, то сценарий контента может использовать сам XHR (предполагая, как у вас,
https
Источник)
Как цитируется @Xan,
Один из рекомендуемых способов-сделать локальную копию удаленного скрипта, однако, если у вас есть веская причина разместить его на сервере, я бы предложил вам сделать вызов ajax на вашем сервере в фоновой странице, а затем вызвать"content_security_policy"
применяется к страницам расширений, похоже, вы вводите удаленный скрипт в текущую веб-страницу, что нарушает CSP текущей страницы.chrome.tabs.executeScript
, чтобы ввести код в текущую страницу.Фрагменты кода будут выглядеть следующим образом:
var xhr = new XMLHttpRequest(); xhr.onload = function() { chrome.tabs.executeScript(tabId, {"code": xhr.responseText}); xhr.open("GET", SERVER_SCRIPT_URL); xhr.send();