XSSは、入力された文字が、画面上でJavaScriptなどのコードとして動いてしまう問題。
コメント欄やプロフィール欄など、利用者の入力を表示する場所で起きやすい攻撃です。
XSSの基本
XSSは「Cross Site Scripting」の略です。名前だけ見ると難しそうですが、まずは「画面に出すはずの文字が、ブラウザに命令として読まれてしまうこと」と考えると分かりやすいです。
たとえばコメント欄に書かれた内容を、そのままHTMLとしてページへ入れてしまうとします。そこに悪意あるスクリプトが混ざっていると、ページを見た人のブラウザでそのスクリプトが動くことがあります。
コメント、名前、検索キーワードなどに危険な文字列が混ざる。
文字として扱うべき内容を、HTMLとしてページに入れてしまう。
ページを見た人のブラウザで、意図しないJavaScriptが実行される。
起きやすい場所
XSSは「利用者が入力した内容を、あとで誰かに見せる場所」で特に注意が必要です。掲示板、レビュー、プロフィール、管理画面のメモ欄などが分かりやすい例です。
攻撃者が狙うのは、サービスのサーバーそのものだけではありません。ページを見た利用者のブラウザ上で処理が動くため、ログイン中の画面や保存された情報が狙われることがあります。
基本の対策
一番大事なのは、画面に表示する値を「命令」ではなく「文字」として扱うことです。そのためによく使われるのがエスケープです。
< や > などを、文字として表示できる形へ変換する。
利用者入力をそのまま innerHTML に入れる実装は避ける。
読み込んでよいスクリプトの出どころを制限し、被害を広げにくくする。
ここまでのまとめ
XSSは、利用者が入力した文字をページに出すときに起きやすい問題です。入力値そのものを疑うというより、表示するときに「これは文字なのか、HTMLなのか」を分けて扱うことが重要です。
XSS対策の第一歩は、利用者の入力を画面に出すとき、必ず文字として扱うことです。