XSSとは?画面でスクリプトが実行される仕組みをわかりやすく解説

まずは、これだけ

XSSは、入力された文字が、画面上でJavaScriptなどのコードとして動いてしまう問題。
コメント欄やプロフィール欄など、利用者の入力を表示する場所で起きやすい攻撃です。

入力欄に混ざった危険なコードがWebページで実行される流れ
入力:文字として送られる 表示:コードとして動く

XSSの基本

XSSは「Cross Site Scripting」の略です。名前だけ見ると難しそうですが、まずは「画面に出すはずの文字が、ブラウザに命令として読まれてしまうこと」と考えると分かりやすいです。

たとえばコメント欄に書かれた内容を、そのままHTMLとしてページへ入れてしまうとします。そこに悪意あるスクリプトが混ざっていると、ページを見た人のブラウザでそのスクリプトが動くことがあります。

入力される

コメント、名前、検索キーワードなどに危険な文字列が混ざる。

そのまま表示する

文字として扱うべき内容を、HTMLとしてページに入れてしまう。

ブラウザで動く

ページを見た人のブラウザで、意図しないJavaScriptが実行される。

起きやすい場所

XSSは「利用者が入力した内容を、あとで誰かに見せる場所」で特に注意が必要です。掲示板、レビュー、プロフィール、管理画面のメモ欄などが分かりやすい例です。

1 投稿 入力欄へ危険な文字列が送られる
2 保存 DBに内容が保存される
3 表示 別の利用者がページを見る
4 実行 ブラウザが命令として読む
5 被害 画面改ざんや情報漏れにつながる

攻撃者が狙うのは、サービスのサーバーそのものだけではありません。ページを見た利用者のブラウザ上で処理が動くため、ログイン中の画面や保存された情報が狙われることがあります。

基本の対策

一番大事なのは、画面に表示する値を「命令」ではなく「文字」として扱うことです。そのためによく使われるのがエスケープです。

エスケープによって危険な記号を文字として安全に表示する流れ
エスケープすると、危険な記号をブラウザが命令として読みにくい形へ変換できます。
表示時にエスケープ

<> などを、文字として表示できる形へ変換する。

HTMLを許可しすぎない

利用者入力をそのまま innerHTML に入れる実装は避ける。

CSPを使う

読み込んでよいスクリプトの出どころを制限し、被害を広げにくくする。

ここまでのまとめ

XSSは、利用者が入力した文字をページに出すときに起きやすい問題です。入力値そのものを疑うというより、表示するときに「これは文字なのか、HTMLなのか」を分けて扱うことが重要です。

XSS対策の第一歩は、利用者の入力を画面に出すとき、必ず文字として扱うことです。