XSSとは?
XSS(クロスサイトスクリプティング)とは、Webサイトの脆弱性を利用して、悪意のあるスクリプトをユーザーのブラウザで実行させる攻撃のことです。
例えば、掲示板やコメント欄など、ユーザーが入力した内容をそのままページに表示する仕組みがある場合、その入力内容に悪意のあるJavaScriptを埋め込まれる可能性があります。
その結果、以下のような被害が発生することがあります。
- ユーザーのログイン情報の盗難
- セッションIDの取得
- 偽の画面を表示させるフィッシング
- 不正な操作の実行
このように、ユーザーのブラウザ上でスクリプトを実行させてしまう攻撃がXSSです。
XSSのイメージ
例えば、コメント欄があるWebサイトを考えてみます。
通常のコメント
とても良いサイトですね!
しかし、悪意のあるユーザーが次のようなコードを投稿した場合
<script>alert('攻撃!')</script>もしこの内容がそのままページに表示されると、ページを閲覧したユーザーのブラウザでJavaScriptが実行されてしまいます。
その結果、
- クッキー情報を送信
- ログイン情報を盗む
- 別サイトへリダイレクト
といった攻撃が可能になります。
XSSが起こる原因
XSSの主な原因は、
ユーザー入力を適切に処理せず、そのままHTMLとして表示してしまうことです。
例えば次のようなコードです。
echo $_GET['name'];もし name にHTMLタグやJavaScriptが含まれていた場合、それがそのままブラウザで実行されてしまいます。
XSSの種類
XSSにはいくつか種類があります。
① 反射型XSS(Reflected XSS)
URLパラメータなどに含まれたスクリプトが、レスポンスにそのまま反映されて実行されるタイプです。
例
https://example.com/?keyword=<script>...</script>主にフィッシングメールなどで悪用されます。
② 保存型XSS(Stored XSS)
掲示板やコメント欄などに悪意あるスクリプトが保存され、それを閲覧したユーザー全員に影響するタイプです。
例
- コメント欄
- プロフィール
- 投稿フォーム
被害が広がりやすいため、危険度が高いとされています。
③ DOM型XSS
サーバーではなく、JavaScriptの処理によってブラウザ上で発生するXSSです。
フロントエンドのコードの書き方によって発生するため、JavaScript実装でも注意が必要です。
XSSの対策方法
XSS対策の基本は、ユーザー入力をそのまま表示しないことです。
主な対策は以下です。
HTMLエスケープ
HTMLタグとして解釈されないように変換します。
例(PHP)
htmlspecialchars($text, ENT_QUOTES, 'UTF-8');これにより
<script>は
<script>
のように変換されます。
テンプレートエンジンを利用する
LaravelやBladeなどのテンプレートでは、基本的に自動でエスケープされます。
例
{{ $text }}入力値のバリデーション
- HTMLタグを禁止する
- 入力形式を制限する
などの対策も有効です。
まとめ
XSS(クロスサイトスクリプティング)は、Webサイトの代表的な脆弱性の一つです。
ユーザーの入力をそのまま表示してしまうと、悪意のあるスクリプトが実行される可能性があります。
重要なポイントは次の3つです。
- XSSはユーザーのブラウザでスクリプトを実行させる攻撃
- 原因はユーザー入力をそのままHTMLとして表示すること
- 対策は「HTMLエスケープ」が基本
Webアプリケーションを開発する際は、ユーザー入力を必ずエスケープすることを意識しましょう。
