polyfill .io問題のQuarto・R Markdownへの影響
どういう問題なのか
よく使われていた JavaScript のライブラリが、ホスティングされていたドメインごと買収されて、変なマルウェアが仕込まれるようになった、という話らしいです。
なぜQuartoユーザー・R Markdownユーザーはこの問題を気にしないといけないのか
なぜかというと、Quarto や R Markdown には数式を表示できますが、HTMLドキュメントに数式を表示する方法のひとつの MathJax が polyfill に依存しているからです。たとえ数式を使っていなくても、おそらく MathJax はデフォルトで有効になっているので[1]、影響を受けます。
頭の痛いことですが、これは「最近Quartoにそういう悪意あるコードが仕込まれた」みたいな話ではなく、依存していたライブラリがドメインごと乗っ取られたわけなので、これまで生成されたドキュメントも影響を受けます(ただし、後述のようにここ1年半くらいの話なので、昔のものはたぶん大丈夫です)。これまでに、数式を使ったウェブサイトやブログなどをQuartoもしくはR Markdownで生成した覚えがあるなら、まず影響を受けていると思っていいでしょう。私もQuartoでつくっていた自分のブログが影響を受けていました...
これは、HTMLドキュメントだけの話なので、その他のフォーマット(PDFとかMarkdownとか)しか生成していない場合は問題ないはずです。
どのバージョンが影響を受けるのか
MathJax
まず、MathJax側の事情ですが、MathJax自体はpolyfillに依存しているわけではなくて、「IE11で動かしたいならpolyfillを使ってね」という案内をしていただけのようです。
IE11は2022年にサポート終了になったので、さすがに2024年にもなってIE11のことを気にする人はいません。MathJaxの公式ドキュメントにはもうpolyfillの案内はありません。なんですけど、MathJaxを組み込んでいるPandocには色々な行き違いでそれが残ってしまっている、ということのようです。
ちなみに、↑のissueを見ると、IE11でのエラーはMathJaxのバージョン3(2019年にリリース)で起こったもののようなので、おそらくバージョン2の時代はpolyfillを使ってなさそうです。
R Markdown
R Markdownの場合は、Pandocのテンプレートに入っているのでPandocのバージョンが問題になります。
v3.1.12.3で修正されました。それ以前のバージョンが影響を受けます。今のところ、RStudioに同梱されている Pandoc のバージョンは 3.1.11 のようなので、影響を受けてしまいます。
rmarkdown::pandoc_version()
#> [1] ‘3.1.11’
ではいつから影響を受けるのかというと、実はけっこう最近です。
Pandocがpolyfillを入れたのは2023年2月のこのコミットでした。バージョン3.1.1としてリリースされたので、それ以降が影響を受けます(なぜ2023年にもなってpolyfillを入れようと思ったのかわからないんですが、この当時はMathJaxのドキュメントではpolyfillの案内がされていたので入れた方がいいと思った、という感じみたいです)。
ちなみに、「そもそもpolyfill要らなくない?」というissueを立てたところ、すぐ対応されてpolyfillは削除されました。次の Pandoc のリリースからは polyfill 自体が入らなくなります。
Quarto
上記のPandoc v3.1.1の変更がQuarto側に取り込まれたのがこのコミット、2023年3月です。バージョンで言うと、v1.3.255以降を使っていると影響を受けるようです。
v1.5はv1.5.24で修正され、今のstable版であるv1.4系もv1.4.556で修正されました。
回避方法は?
ドキュメントを直接編集
もういちどknitするのは重いので避けたい、というケースは往々にしてあると思います。
生成されたドキュメントをテキストエディタなどで開いて、polyfillへのリンクを取り除きましょう。polyfillはIE11のようなクソ古いブラウザをサポートするためのものなので、なくても問題ないはずです。
Quarto
Quartoの場合は、単純にバージョンを最新版に上げてましょう。
もしどうしてもバージョンを上げられない事情がある場合は、MathJaxではなくKaTeXを使うのも手でしょう。html-math-method
で設定できます。
R Markdown
R Markdown の場合は、あまりお手軽な解決方法がなさそうです。 Pandocのバージョンを上げるのは難しいですが、KaTeXが使えるみたいなので[2]切り替えるのがいいでしょう。指定の仕方は、?rmarkdown::html_document
のmath_method
にサンプルのYAMLがあるのでそこを見てください。
output:
html_document:
math_method:
engine: katex
url: https://cdn.jsdelivr.net/npm/katex@0.11.1/dist
自分で Pandoc をインストールしてそれを使うという手はありますが、このあたりはパスの設定などに慣れていないとちょっと難易度が高いかもです。
あるいは、MathJax を無効にすることもできます。自分で URL を指定することもできますが、これはあくまで MathJax の URL の指定なので、polyfill の URL を指定できるかどうかはよくわかりませんでした。
-
Quartoだと、単体のドキュメントの場合は、実際に数式があるときのみMathJaxが挿入されるようです(heavywatalさん、情報ありがとうございます)。ただし、私のブログは数式を使っていませんが、エントリー一覧ページには勝手にMathJaxが入るようになっていました。設定によって違うようなので、数式が入っていなくても念のため注意した方がよさそうです。 ↩︎
-
atusyさん、情報(そしてrmarkdownパッケージへの実装)ありがとうございました。 ↩︎
Discussion