ServiceWorkerを無効化する

はじめに

ServiceWorkerと言うこの頃話題の機能がブラウザに追加されました。既存のウェブページではできなかった。スマホのアプリのような機能をブラウザで実現できる素晴らしい機能です。ただし、ユーザの事前承認なしに登録できます。

ServiceWorkerは、スマホアプリのような機能を無承認で実行できるため、便利な半面でとても危険な機能です。ウイルス対策ソフト(Windows Defender)では、一部のServiceWorkerをウイルスとして検出することがあります。ServiceWorkerは、サイトを閉じても動作し続けることが可能なため、ブラウザの動作を重くする原因にもなります。

登録済みのServiceWorkerを確認する

次のアドレスにアクセスすれば確認できます。手動による登録解除も可能です。

// Chrome
chrome://serviceworker-internals

// Edge
edge://serviceworker-internals

// Firefox
about:debugging#workers

※Chromeでは、Google関連サービスの手動登録解除ができません。

ユーザスクリプトでServiceWorkerの登録を拒否する

ServiceWorkerの登録関数を置き換えてしまうことで新規登録を拒否します。また、ServiceWorkerは登録解除が可能です。なので、登録済みのServiceWorkerを登録解除します。

仕様

  • ServiceWorkerの登録関数を置き換えて新規登録不可にする
  • ServiceWorkerが登録済みならば登録解除する
  • ServiceWorkerが登録済みならばキャッシュもクリアする
  • @excludeを設定することでホワイトリストとして利用できる
  • ユーザスクリプトの実行タイミングでは、完全な登録拒否はできない
    • ページへのスクリプト挿入が少し遅れるため

ユーザスクリプトのコード

RejectServiceWorker.user.js// ==UserScript==
// @name         RejectServiceWorkers.user.js
// @description  Reject to register a ServiceWorker.
//               Unregister the registered Service Worker.
//               If ServiceWorker was registered, it clears the cache.
//               You can use it as a whitelist by setting @exclude.
//               It is not possible to completely reject registration at the timing of executing the user script.
// @run-at       document-start
// @include      https://*/*
// @exclude      https://example.com/*
// @author       toshi (https://github.com/k08045kk)
// @license      MIT License
// @see          https://opensource.org/licenses/MIT
// @version      0.1.1
// @see          0.1.0 - 20200328 - 初版
// @see          0.1.1 - 20200415 - 修正
// @see          https://www.bugbugnow.net/2020/03/Reject-to-register-a-ServiceWorker.html
// @grant        none
// ==/UserScript==

(function() {
  // Reject to register a ServiceWorker
  if ('serviceWorker' in navigator) {
    ServiceWorkerContainer.prototype.register = function(scriptURL, options) {
      return new Promise((resolve, reject) => {
        //console.log('Reject to register a ServiceWorker.');
        reject(new Error('Reject to register a ServiceWorker.'));
      });
    };
  }

  // Unregister the registered Service Worker
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.getRegistrations().then((registrations) => {
      for (let i=0; i<registrations.length; i++) {
        registrations[i].unregister();
        //console.log('ServiceWorker unregister.');
      }
      if (registrations.length != 0) {
        window.caches.keys().then((keys) => {
          Promise.all(keys.map((key) => { return window.caches.delete(key); })).then(() => {
            //console.log('caches delete.');
          });
        });
      }
    });
  }
})();

拡張機能でServiceWorkerをブロック(または、管理)する

次のような格納機能が既に作成されています。まだ、出始めの機能であるため、探せばもっと良いものがあるかもしれません。

宣伝(筆者作成の拡張機能)

上記ユーザスクリプトと同じような動作をします。拡張機能は、ユーザスクリプトより実行タイミングが早いため、より強力に動作します。

ブラウザ設定でServiceWorkerを無効化する

Chrome(無効化できない)

ChromeでServiceWorkerを無効にする方法は発見できませんでした。次の記事で紹介されている方法では無効化できないことを確認しています。記事内でも無効化できなかったと記載されています。そのため、現状ChromeでServiceWorkerを無効化する場合、上記ユーザスクリプトや拡張機能を利用するのが懸命です。

Firefox

Firefoxは、about:configからdom.serviceWorkers.enabledfalseとすることでServiceWorkerを無効化できます。ただし、既に登録済みのServiceWorkerは動作するため、事前にabout:debugging#workersからすべてのServiceWorkerを登録解除する必要があります。

※設定の反映には、Firefoxの再起動が必要になります。
dom.serviceWorkers.enabled=false設定後にServiceWorkerが動作しているのは、次の記事でのFirefoxの挙動を元に推測したものです。
 Firefoxの「コンテンツデータ破損エラー」解決方法

参考

コメント