DOMPurify vs sanitize-html 比較してみた。XSS対策にどっちを選べば良いのか
XSS対策のためのJavaScriptライブラリ「DOMPurify」と「sanitize-html」を比較。それぞれの特徴(想定利用シーン、目的、開発者、メンテ状況)を解説し、どちらを選ぶべきか考察します。将来的なSanitizer APIにも言及。
sanitize-html と DOMPurify はどちらもXSS対策としてのサニタイズ(エスケープ)に使えるライブラリです。
通常、どちらを使うべきなのでしょうか?
※ あくまで比較的にどうか、という視点です。どちらも良いライブラリですし、どちらも多くのシステムで採用されています。
結論: DOMPurify推奨
「出力時のXSS対策」をしたいケースでは、DOMPurifyを第一候補にするのが実務的です。
ブラウザ利用ではバンドルが軽量になりやすく、セキュアデフォルトで実績・保守状況も良好です。
一方で、要件(保存前のクレンジングルール、細かな許可ルール運用など)によってはsanitize-htmlが適する場合もあります。
ポイント:
- DOMPurifyは軽い
- 両者ともクライアント/サーバーで利用可能(用途と運用方針の違いが選定ポイント)
- DOMPurifyをサーバーで使う場合は
isomorphic-dompurifyを使えば同一APIで扱える
以下より、それぞれの特徴について簡潔に整理します。
DOMPurifyの特徴
DOMPurifyはXSS対策を目的としたサニタイザで、ブラウザの出力時サニタイズに使われることが多いです。Node.jsでも利用可能で、サーバーでも同一APIで扱いたい場合は isomorphic-dompurify を利用できます(後述)。
セキュリティ分野の専門家が開発に関与しており、セキュアデフォルトでの運用がしやすい点が評価されています。
DOMPurify は、Web 攻撃と XSS に豊富な経験を持つセキュリティ担当者によって作成されました。
DOMPurifyのGitHub
sanitize-htmlの特徴
sanitize-htmlは保存前クレンジングや、厳格な許可/禁止ルールを事前適用したいようなNode.jsサーバーでの運用で選ばれることが多いライブラリです。
クライアントでも利用可能で、当然XSS対策にも利用できます。
ルールの詳細なカスタマイズに強みがありますが、同様の方針はDOMPurifyでも設定で近づけられます。選定は、既存のサーバー処理フローやチームの運用方針(保存前に正規化するか、出力時に整えるか)との相性で決めるのが現実的です。
サーバーでDOMPurifyを使う(isomorphic-dompurify)
Node環境にはDOMが無いため、そのままではDOMPurifyを初期化できません。isomorphic-dompurify はサーバーで必要なDOM実装を用意し、クライアントと同じAPIでDOMPurifyを扱えるようにするラッパーです。
これにより、サーバーでもDOMPurifyを採用でき、SSRにも対応できます。
基本的にsanitize-htmlを使わずに統一できます。
まとめ
迷ったらまずはDOMPurify(出力時サニタイズ)を検討し、SSRなどサーバーでも同一APIで扱いたい場合は isomorphic-dompurify をあわせて利用するのが良いでしょう。
保存前の正規化や厳格なルール適用を重視したい場合には、sanitize-htmlが適するケースもあります。特にサーバーだけで使う場合にはsanitize-htmlのほうが速いらしいです(未検証)。
おまけ:HTML Sanitizer API
Sanitizer APIというブラウザのAPIが実験的に開発されており、将来的にはこれで良くなる可能性が高いです。
まだほとんどのブラウザでフルに使えませんが、これが完全にリリースされて全てのブラウザが対応したらこれが出力時のサニタイズのスタンダードになるでしょう。