Ошибка" отказано в загрузке скрипта " в расширении 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 3

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 страницы и терпит неудачу.

  1. Теоретически, вы можете повлиять на собственный CSP страницы, перехватывая и перехватывая заголовки ответов с помощью webRequest. Однако это не очень хороший подход: вы, как правило, вмешиваетесь в безопасность сторонней страницы. Никто не собирается быть счастливым об этом.

  2. То, что вы можете сделать, это загрузить скрипт на фоновой странице с помощью XHR, а затем либо:

    • Введите его в контекст скрипта содержимого с помощью chrome.tabs.executeScript({code: ...}), который не подчиняется CSP страницы;

    • Передайте его контекстному скрипту, чтобы он мог быть введен на страницу, добавив <script>...</script> к DOM, который обходит CSP страницы, пока он не нарушает его далее (загружая больше сценариев или используя eval/встроенный код).

      P.S.: Как предполагает Роб У, Если вы планируете это сделать, то сценарий контента может использовать сам XHR (предполагая, как у вас, https Источник)

Как цитируется @Xan, "content_security_policy" применяется к страницам расширений, похоже, вы вводите удаленный скрипт в текущую веб-страницу, что нарушает CSP текущей страницы.

Один из рекомендуемых способов-сделать локальную копию удаленного скрипта, однако, если у вас есть веская причина разместить его на сервере, я бы предложил вам сделать вызов ajax на вашем сервере в фоновой странице, а затем вызвать 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();