mikexxz
記事一覧

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

一个发光的金属漏斗过滤网拦下红色尖刺恶意代码,只让干净的文档卡片通过。

Markdown ではHTMLを埋め込めます。これは、「ユーザーが投稿した Markdown をレンダリングする」ことが、本質的には「ユーザーが投稿した HTML をレンダリングする」ことと同じだという意味です。

最も単純な例

次の Markdown をそのまま HTML に変換してページに挿入すると、スクリプトが実行されてしまいます。

看起来是一条普通评论。

<img src="x" onerror="alert(document.cookie)">

[点我](javascript:alert(1))

二重の防御

  1. Markdown を HTML に変換する際に、生の HTML を破棄し、出力に含めないようにします
  2. HTML を生成した後に、ホワイトリストに基づいてサニタイズします。安全と分かっているタグと属性だけを残し、リンクには http、https、mailto などのプロトコルのみを許可します

2層目は最後の砦です。たとえ1層目の設定が後から誰かに変更されたとしても、危険な内容がブラウザに届くことはありません。

ブラックリストは使わないでください。危険なものをすべて列挙することは決してできませんが、必要なものをすべて列挙することはできます。

コメント

このコメントを削除しますか?

コメントの内容は消去され、元に戻すことはできません。