Подтвердить что ты не робот

Может ли сайт блокировать расширение Chrome?

Возможно ли заблокировать Chrome Extensions на определенных веб-сайтах?

Скажем, у меня есть веб-сайт www.foo.com, можно ли заблокировать расширения Chrome (в частности, скрипты контента) от работы на моем веб-сайте или остановить их от доступа к DOM?

4b9b3361

Ответ 1

Для короткого ответа на вопрос goto 4th Edit:

Вам нужно знать расширение с помощью расширения, которое вы хотите заблокировать, чтобы оно работало.

Вот тестезит из Доказательства Концепции Testsite

и вот информация, стоящая за решением: Вступление к взлому аддонов Chrome: отпечаток пальца

Теперь, когда вы знаете, какие расширения выполняются, вы можете перенаправить /block/...

Надеюсь, это поможет.

Edit:

Протестировано (версия Chrome 27.0.1453.94) в Windows XP

Изменить 2:

Этот метод будет работать, только если:

  • Вы знаете расширение:)
  • ВАЖНО! по крайней мере один Ressource (например, manifest.json, некоторое изображение, script,...) устанавливается как "web_accessible_resources" (в манифесте) ИЛИ расширение по-прежнему использует манифест версии 1 и не имеет набора "web_accessible_resources". (Ressource from chrome dev site Ссылка)

Изменить 3:

Расширение корпуса: JSONView

Вы можете обнаружить расширение с помощью этого кода (только код примера):

<script src="chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif" onerror="console.info('Extension Not Found')" onload="console.info('Extension Found')"></script>
<!-- since the the file error.gif is allowed in the manifest "web_accessible_resources" (any other file mentioned there would also be fine) -->
<!-- the block code should come in the onload of the script tag -->
<!-- tested with Chrome 27+ WinXp -->

Контекст: Расширение JSONView имеет версию 2 Manifest:

...
"manifest_version": 2, 
"name": "JSONView",
...

поэтому по умолчанию вы не можете получить доступ к файлу манифеста, как указано в "Доказательстве концепции" выше.

НО он использует атрибут "web_accessible_resources в манифесте, что позволяет веб-сайтам получать доступ к файлам из расширения.

...
"web_accessible_resources": [ "jsonview.css", "jsonview-core.css", "content_error.css", "options.png", "close_icon.gif", "error.gif" ]
...

Итак, теперь вы можете вызывать любой из этих файлов со своей веб-страницы.

Пример:

chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/error.gif
chrome-extension://chklaanhfefbnpoihckbnefhakgolnmc/jsonview.css
...

И с этим URL-адресом в изображении / Script/.. -Tag вы можете узнать, существует ли расширение, если запускается событие onload.

P.s.: я только протестировал это с помощью Chrome Version 27.0.1453.94) в Windows XP, в других версиях он может не работать. (см. комментарий от T.J. Crowder)

P.P.s.: Дополнительные сведения см. в разделе "Ресурсы для разработчиков Chrome". Вот ссылка на расширение на странице хронологического просмотра Chrome "Finger printing" Stuff)

Изменить 4:

Я не думаю, что это может быть заблокировано как таковое, но если вы можете обнаружить расширение, как указано выше, вы можете:

  • перенаправить с вашей страницы.
  • или всплывающее сообщение (каждые несколько секунд), говорящее "отключите расширение для этого сайта"
  • или вы можете проверить код расширения, чтобы увидеть, возможно, вы можете "сломать" или затруднить его функциональность.
  • или вы можете использовать некоторый код, как в ответе BeardFist

Ответ 2

Поскольку другой ответ действительно ничего не ответил на фактическое прекращение расширения, я думал, что добавлю свои два цента. Используя этот метод в другом ответе, вы иногда можете определить, установлено ли конкретное расширение и соответствующим образом реагировать, но для этого требуется проверить конкретную строку и файл ID для этого конкретного расширения. Я уверен, что мы все можем согласиться с тем, что это не очень всеобъемлющее решение.

Есть много вещей о расширениях, которые вы не можете остановить на своем сайте, например, chrome.webRequest api, который использует adblock. Вы ничего не можете сделать, чтобы напрямую вмешиваться в этот тип кода, но на стороне DOM можно многое сделать.

Content Scripts работают в isolated world, что означает, что они не могут видеть/взаимодействовать с javascript, запущенным на сайте. Тем не менее, они имеют полный доступ к DOM и могут делать все, что захотят. И наоборот, ваш собственный javascript имеет тот же доступ к этому DOM. Воспользовавшись этим isolated world, мы можем настроить MutationObserver для просмотра DOM и предотвращения любых нежелательных изменений. Из-за isolated world, Content Scripts не может отключить или отключить нашего наблюдателя, в то время как наш собственный javascript может делать это свободно.

Вот пример MutationObserver, который блокирует DOM с небольшим количеством jQuery, потому что я ленив.

var config= {childList: true,
             attributes: true,
             characterData: true, 
             subtree: true, 
             attributeOldValue: true, 
             characterDataOldValue: true};
var observer = new MutationObserver(function(mutations){
  mutations.forEach(function(mutation){
    switch(mutation.type){
      case "attributes":
        observer.disconnect();
        if(mutation.attributeName == "class")
         mutation.target.className = mutation.oldValue;
        else if(mutation.attributeName=="id"||mutation.attributeName=="title")
         mutation.target[mutation.attributeName] = mutation.oldValue;
        else if(mutation.attributeName == "style")
          mutation.target.style.cssText = mutation.oldValue;
        observer.observe(document,config);
        break;
      case "characterData":
        observer.disconnect();
        mutation.target.data = mutation.oldValue;
        observer.observe(document,config);
        break;
      case "childList":
        observer.disconnect();
        if(mutation.addedNodes.length > 0)
          $(mutation.addedNodes[0]).remove();
        if(mutation.removedNodes.length > 0){
          if(mutation.nextSibling)
            $(mutation.removedNodes[0]).insertBefore(mutation.nextSibling);
          else if(mutation.previousSibling)
            $(mutation.removedNodes[0]).insertAfter(mutation.previousSibling);
          else
            $(mutation.removedNodes[0]).appendTo(mutation.target);
        }
        observer.observe(document,config);
        break;
    }
  });
});

$(function(){
  observer.observe(document,config);
});

Бросив его на расширение хром с помощью простого манифеста, например:

{
  "name": "DOM Polymerase",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": [
    "tabs","<all_urls>"
  ],
  "content_scripts": [{
    "matches": ["http://example.iana.org/*"],
    "js": ["jquery-1.8.3.min.js","polymerase.js"]
  }]
}

И переход на http://example.iana.org/ покажет, что внешняя манипуляция с DOM (за исключением некоторых атрибутов, я не кодировал их всех там) больше не возможное. Конечно, в этом случае внутренняя манипуляция также отрицается, но если код был на сайте вместо расширения, это будет другая история. Хотя это не полностью отключает расширения, оно должно по крайней мере сохранить ваш DOM.