昔掲示板にスクリプトを埋め込むタイプのXSSがあったそうですが、これは何型のXSS? どうやれば防げる? |
|
|
はい。昔の掲示板でよく問題になった「投稿欄にスクリプトを仕込んで、閲覧者のブラウザで実行させる」タイプなら、典型的には Stored XSS(蓄積型XSS) です。 どういう仕組み?例えば掲示板が、 という仕組みだったとします。 問題は、投稿内容を単なる「文字列」として扱わず、HTMLとして解釈できる状態でページに埋め込んでしまうことです。 これがStored XSSです。 どうやって防ぐ?一番基本は、
ことです。 例えばユーザーがHTMLとして意味を持つ文字列を投稿したとしても、 をそのままHTMLに入れるのではなく、ブラウザ上では単なる文字として表示されるようにします。 これがHTMLエスケープです。 例えば概念的には、 などに変換します。 するとブラウザは、 を「HTMLタグ」ではなく、 というただの文字列として表示します。 「入力時に削除」ではなく「出力時にエスケープ」が基本ここは重要です。 ありがちな発想が、 ですが、これはあまり良い防御方法ではありません。 なぜなら、
からです。 そのため基本は、 です。 もちろん、HTMLを許可する必要があるサービスなら、単純なエスケープではなく許可するタグ・属性だけを残すサニタイズが必要になります。 最近のWebフレームワークはかなり防いでくれる例えばテンプレートエンジンには、
という自動エスケープ機能があります。 イメージとして、 にユーザー入力を渡すと、 を自動的にHTMLエスケープしてくれます。 そのため現代のフレームワークでは、普通にテンプレートを使っているだけならXSSになりにくい設計になっています。 ただし、 などを使うと、自動エスケープを意図的に無効化することができるため、そこが危険になります。 さらにCSPも使う以前話していたCSPもXSS対策として非常に重要です。 例えば、 のようにして、
という制約をブラウザに与えます。 CSPはXSSそのものを修正するものではありません。 という関係です。 Cookieも防御になるXSSによるセッション乗っ取り対策としては、Cookieに などの属性を設定します。 特に ただし、
わけではありません。 XSSが成立していると、被害者のブラウザ上でサイトの権限を使って操作される可能性があるためです。 掲示板の場合はこうするのが基本そして追加で、 などを組み合わせます。 まとめると昔の掲示板の「投稿内容にスクリプトを仕込んで、他の人がその投稿を見ると実行される」タイプなら、ほぼ典型的なStored XSSです。 防御の中心は**「ユーザー入力をHTMLとして解釈させない」=コンテキストに応じた出力エンコーディング(HTMLエスケープ)**です。 そして、CSPや |
| |

この記事へのコメント