Grammarly拡張機能がWebサイトを壊した理由
- ここ数か月、Webサイトのレイアウトがおかしく崩れるという報告をたびたび受けていた
- 問題の原因はGrammarlyのブラウザー拡張機能だと判明し、それを確認するために本人も実際にインストールしてみた
問題発見の過程
- Grammarly拡張機能は次のような権限を要求する:
- すべてのWebサイトのデータへのアクセス
- 通知の表示
- ブラウザータブへのアクセス
- Firefoxで実験した結果、GrammarlyはWebページに独自のスタイルシートを挿入していた
- このスタイルシートはWebページ側から直接検出できない(隠されたスタイルシート)
- Content Security Policyさえ回避する
<html>タグ内に<grammarly-desktop-integration>要素も挿入される(目的は不明)
なぜ自分のサイトだったのか?
著者の対応
- 最初はMutation Observerを使ってGrammarlyが挿入した要素を検出し、
!importantスタイルで上書きした
- その後、自分のCSS変数名を
--remから**--🤡(Unicode絵文字)**に変更した
- 絵文字はCSS変数名として有効である
- こうすることで、Grammarlyのグローバルな
--rem設定との衝突を避けられる
問題の本質
- GrammarlyはWeb拡張機能として、すべてのWebサイトにグローバルスタイルを強制的に挿入している
- とりわけ
--remのような一般的なCSS変数名を使うのは非常に有害である
- コード内部ではランダムなクラス名を使っているのに、なぜわざわざ共通の命名をグローバルに適用したのか理解できない
- 実際に拡張機能を使っていなくてもコードは挿入される
結論と提案
- 著者はGrammarlyに問い合わせ、素早い返答はあったが、技術的に問題を理解している担当者にはつながらなかった
- 理想的な解決策は、Grammarlyが
--🤡のような変数名を使い、ほかの開発者が自由に--remを使えるようにすることだ
1件のコメント
Hacker Newsの意見
自分の拡張機能の問題は少し異なる。私たちは地理的位置のテストのために、プロキシサーバー間の切り替えを簡単にする拡張機能を配布している
スクリプトやスタイルが不明なページに注入するときは、変数に名前空間を付けるのが最低限の礼儀だ
多くの画面共有や録画で、デフォルトの状態であらゆるウェブサイトにGrammarlyの侵入が含まれているのを見るのは恐ろしい
Grammarly Extensionのエンジニアです。dbushell.comのUXを壊してしまい申し訳ありません
この問題をエンジニアリングチームに伝えた
Google Translateが自分のウェブアプリを壊す似たような問題がある
仕事中、ブラウザ拡張機能に関連するsentryエラーがたくさんある
ウェブを最も壊せる変数は何だろうと思う
敵対的なブラウザ拡張機能にどう対処しているのか気になる
この方法でプラグインをハイジャックできるのか気になる