はじめに
ServiceWorkerと言うこの頃話題の機能がブラウザに追加されました。既存のウェブページではできなかった。スマホのアプリのような機能をブラウザで実現できる素晴らしい機能です。ただし、ユーザの事前承認なしに登録できます。
ServiceWorkerは、スマホアプリのような機能を無承認で実行できるため、便利な半面でとても危険な機能です。ウイルス対策ソフト(Windows Defender)では、一部のServiceWorkerをウイルスとして検出することがあります。ServiceWorkerは、サイトを閉じても動作し続けることが可能なため、ブラウザの動作を重くする原因にもなります。
登録済みのServiceWorkerを確認する
次のアドレスにアクセスすれば確認できます。手動による登録解除も可能です。
// Chrome
chrome://serviceworker-internals
// Edge
edge://serviceworker-internals
// Firefox
about:serviceworkers
about:debugging#workers
※Chromeでは、Google関連サービスの手動登録解除ができません。
ユーザスクリプトでServiceWorkerの登録を拒否する
ServiceWorkerの登録関数を置き換えてしまうことで新規登録を拒否します。また、ServiceWorkerは登録解除が可能です。なので、登録済みのServiceWorkerを登録解除します。
仕様
- ServiceWorkerの登録関数を置き換えて新規登録不可にする
- ServiceWorkerが登録済みならば登録解除する
- ServiceWorkerが登録済みならばキャッシュもクリアする
@exclude
を設定することでホワイトリストとして利用できる@include
の設定を変更することでブラックリストとしても利用できる- 「
// @include https://*/*
」を指定のサイトに変更する
- 「
- ユーザスクリプトの実行タイミングでは、完全な登録拒否はできない
- ページへのスクリプト挿入が少し遅れるため
ユーザスクリプトのコード
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.2.0
// @see 0.1.0 - 20200328 - 初版
// @see 0.1.1 - 20200415 - 修正
// @see 0.2.0 - 20200926 - Greasemonkey対応(unsafeWindow経由でwindowのオブジェクトを書き換え)
// @see https://www.bugbugnow.net/2020/03/Reject-to-register-a-ServiceWorker.html
// @grant unsafeWindow
// ==/UserScript==
(function(w) {
// Reject to register a ServiceWorker
if ('serviceWorker' in navigator) {
w.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) {
caches.keys().then((keys) => {
Promise.all(keys.map((key) => { caches.delete(key); })).then(() => {
//console.log('caches delete.');
});
});
}
});
}
})(unsafeWindow || window);
拡張機能でServiceWorkerをブロック(または、管理)する
次のような拡張機能が既に作成されています。まだ、出始めの機能であるため、探せばもっと良いものがあるかもしれません。
宣伝(筆者作成の拡張機能)
上記ユーザスクリプトと同じような動作をします。拡張機能は、ユーザスクリプトより実行タイミングが早いため、より強力に動作します。
他
ブラウザ設定でServiceWorkerを無効化する
Chrome(無効化できない)
ChromeでServiceWorkerを無効にする方法は発見できませんでした。次の記事で紹介されている方法では無効化できないことを確認しています。記事内でも無効化できなかったと記載されています。そのため、現状ChromeでServiceWorkerを無効化する場合、上記ユーザスクリプトや拡張機能を利用するのが懸命です。
Firefox
Firefoxは、about:config
からdom.serviceWorkers.enabled
をfalse
とすることでServiceWorkerを無効化できます。ただし、既に登録済みのServiceWorkerは動作するため、事前にabout:serviceworkers
からすべてのServiceWorkerを登録解除する必要があります。
※設定の反映には、Firefoxの再起動が必要になります。