他人のページに悪意あるスクリプトを埋め込む攻撃。出力時のエスケープと CSP で防ぐ。
XSS は、攻撃者が用意したスクリプトを、他のユーザーが見るページの中で動かす攻撃です。そのサイトのオリジンで動くので、Cookie(HttpOnly でないもの)や画面の情報を盗んだり、ユーザーになりすまして操作したりできます。
| 種類 | 仕組み | 例 |
|---|---|---|
| 反射型 | URL などの入力を、そのまま返すページに埋め込む | /search?q=<script>… のリンクを踏ませる |
| 格納型 | DB に保存された入力が、他の人の画面に出る | 掲示板・プロフィール・商品レビュー |
| DOM ベース | サーバーを通らず、ブラウザの JS が入力を危ない形で DOM に入れる | location.hash を innerHTML に入れる |
フレームワークのエスケープと、危ない書き方
基本の対策は、出力するときに < > & " などを文字として表示されるように変えるエスケープです。React・Vue・テンプレートエンジンは {value} のような埋め込みを自動でエスケープします。ただし次は自動では守られません。
dangerouslySetInnerHTML・v-html・innerHTML:HTML をそのまま入れる。どうしても必要なら DOMPurify などでサニタイズ(危ないタグや属性を取り除く)してから。href・srcに入れる URL:javascript:alert(1)が動く。https:などの許可したスキームだけ通す。eval・new Function・setTimeout("文字列")。- サーバー側で JSON を
<script>に埋め込むとき(</script>で抜けられる)。
面接ではこう答える
XSS は、攻撃者の用意したスクリプトを、他のユーザーが見るページの中で動かす攻撃です。そのサイトのオリジンで動くので、画面の情報を盗んだり、本人になりすまして操作したりできます。基本の対策は出力するときのエスケープで、React などは自動で行いますが、dangerouslySetInnerHTML や href に入れる URL は守られません。二重の守りとして CSP を使い、Cookie は HttpOnly にします。
Webとの関わりユーザーの入力を表示する機能すべてで意識し、コードレビューで危ない書き方を見つけるのに使います。