Markdown をレンダリングするなら sanitize が必須な理由

Markdown ではHTMLを埋め込めます。これは、「ユーザーが投稿した Markdown をレンダリングする」ことが、本質的には「ユーザーが投稿した HTML をレンダリングする」ことと同じだという意味です。
最も単純な例
次の Markdown をそのまま HTML に変換してページに挿入すると、スクリプトが実行されてしまいます。
看起来是一条普通评论。
<img src="x" onerror="alert(document.cookie)">
[点我](javascript:alert(1))
二重の防御
- Markdown を HTML に変換する際に、生の HTML を破棄し、出力に含めないようにします
- HTML を生成した後に、ホワイトリストに基づいてサニタイズします。安全と分かっているタグと属性だけを残し、リンクには
http、https、mailtoなどのプロトコルのみを許可します
2層目は最後の砦です。たとえ1層目の設定が後から誰かに変更されたとしても、危険な内容がブラウザに届くことはありません。
ブラックリストは使わないでください。危険なものをすべて列挙することは決してできませんが、必要なものをすべて列挙することはできます。
コメント