uBlock Origin / Adblock Plus 間のフィルタ非互換性に関するちょっとだけ怖い話
フィルタ・オプションには違いも多い
uBlock Origin のフィルタ記法 は Adblock Plus のフィルタ記法 をベースに強化されている。
uBlock Origin では例えば inline-script
オプションを使用して HTML 内に埋め込まれたスクリプトを無効化したり、document
オプションで strict blocking と言ってアクセス先のドキュメント(HTML)をブロックできる。
Adblock Plus のフィルタ・オプションは全て uBlock Origin でも使用できると思っていたが
2015年12月から2016年1月にかけ Adblock Plus は ping というオプションを実装し、Adblock Plus 2.7.1 としてリリースした。このオプションは広告の表示回数測定やアクセス解析の <a ping>
や navigator.sendBeacon()
をブロックできるので早速追加したんだが...uBlock Origin では(同等だが粗めの設定が別にあるためか)サポートしてなかった orz
サポートしてないフィルタ・オプションの扱い
- Adblock Plus の場合、以前はサポートしてないオプションは存在しないものとして扱われたため
$popup,image,~image
みたいな「芸」が流行ったが、その後サポートしてないオプション指定しているフィルタは無効になった(該当ドキュメントみつけられなかった orz) - uBlock Origin ではサポートしてないフィルタ・オプションは内部的に
other
と自動変換されるため、意外なところで不具合が発生する
other
になってしまったことが関係する uBlock Origin のみで発生する不具合の例
Incompatibility between ABP and uBO over FETCH (json) · Issue #2226 · gorhill/uBlock · GitHub (英語)
- 日本語で説明すると、FETCH リクエストが uBlock Origin のバグのため
other
と分類されたため、|http:$ping
→|http:$other
フィルタにマッチして意図せずブロックされるという不具合が発生していた。 - uBlock Origin の作者は FETCH リクエストを Adblock Plus 同様に
xmlhttprequest
と修正することで報告した不具合を回避しつつ、ping
オプションの実装についてはそのうち...としている。 - FETCH を利用する Web サイトは上記で報告した以外にも多く、ABP Japanese Filters の
|http:$ping
で不具合が発生しまくっていたため、該当フィルタをコメントアウトして無効化しつつ取り急ぎ uBlock Origin 作者にバグ報告をした次第。 - FETCH を
xmlhttprequest
とする修正は開発版で済んでおり、次の安定版に盛り込まれる。
まとめ: 非互換性による意図せぬ不具合を避けるためには
- Adblock Plus のほうが無効なフィルタ・オプションに対する対処が安全(該当フィルタが無効化される)なので、uBlock Origin の仕様に合わせてフィルタを書いたほうが不具合が起こりにくいと言える
- 購読できるフィルタの作者は
ping
オプションの利用を uBlock Origin の実装完了まで待ったほうが良い