6-10 XSSとは?なぜ危険なのか

Web開発学習ロードマップ

前の記事では、
PHPで バリデーション(入力チェック) を行い、
「正しいデータだけを処理する」方法を学びました。

しかし、
バリデーションだけでは
セキュリティは十分ではありません

入力されたデータは、
「正しい内容」であっても
安全とは限らない からです。

その代表的な脆弱性が、
XSS(クロスサイトスクリプティング) です。

この記事では、
XSSとは何か、なぜ危険なのか、
PHPでの基本的な対策方法

コード付きで解説します。


この記事で学べること

・XSSとは何か
・XSSが起きる仕組み
・XSSで何が起こるのか
・PHPでの基本的な対策方法
・バリデーションとの違い


XSSとは何か

XSS(Cross Site Scripting)とは、
ユーザーが入力した内容が、
意図せずスクリプトとして実行されてしまう脆弱性
です。

本来はただの文字として扱うべき内容が、

・HTMLとして解釈され
・JavaScriptとして実行される

ことで、
深刻な被害につながります。


XSSが起きる典型的な例

まずは、
問題のあるコード を見てみましょう。

サンプルコード①:危険な表示方法

<?php
$message = $_POST['message'] ?? '';
echo $message;

このコードでは、

・ユーザー入力を
・そのまま
・画面に表示

しています。


悪意ある入力がされた場合

もし、
次のような内容が入力されたらどうなるでしょうか。

<script>alert('XSS')</script>

この文字列が
そのまま表示されると、

・scriptタグが実行され
・アラートが表示される

という状態になります。

これが XSS です。


XSSで何が起こるのか

XSSが成立すると、
次のような被害が起こります。

・偽の画面を表示される
・入力内容を盗まれる
・Cookieを不正に取得される
・なりすましが行われる

ユーザーに直接被害が及ぶため、
非常に危険な脆弱性 とされています。


なぜXSSが起きるのか

原因は非常にシンプルです。

「ユーザー入力を信用して、そのまま出力している」

PHPは、
表示の安全性を
自動では保証してくれません。


XSS対策の基本は「エスケープ」

XSSを防ぐための基本対策は、
エスケープ処理 です。

エスケープとは、

・HTMLとして意味を持つ文字を
・ただの文字として扱う

ように変換することです。


PHPでの基本的なXSS対策

PHPでは、
次の関数を使うのが基本です。

・htmlspecialchars


サンプルコード②:安全な表示方法

<?php
$message = $_POST['message'] ?? '';
$safeMessage = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');

echo $safeMessage;

コードの読み解き

・htmlspecialchars
 → 特殊文字をHTMLエンティティに変換
・ENT_QUOTES
 → シングル・ダブルクォートも変換
・UTF-8
 → 文字コード指定

これにより、

<>
"'

が、
ただの文字として表示 されます。


バリデーションとXSS対策の違い

ここは非常に重要です。

・バリデーション
 → 入力が正しいかを確認

・XSS対策
 → 表示して安全かを確認

バリデーションをしていても、
XSS対策は必須 です。


エスケープは「出力時」に行う

XSS対策の基本原則です。

エスケープは、表示する直前に行う

理由は、

・保存形式を壊さない
・用途に応じて出力方法が変わる

ためです。

入力時ではなく、
出力時に必ずエスケープ
と覚えてください。


初心者がよくやるミス

XSS対策で多いミスです。

・バリデーションだけで安心する
・一部の表示だけ対策する
・エスケープを忘れる

「ユーザー入力を表示する」

「XSS対策が必要」

この意識を持ちましょう。


実務での考え方

実務では、

・XSSが起きないようにする
ではなく
・XSSが起きる前提で対策する

という考え方が基本です。


まとめ

XSSは、

・ユーザー入力を
・そのまま表示することで
・発生する脆弱性

です。

対策の基本は、

・出力時にエスケープ
・htmlspecialchars を使う

この2点です。

ここまで理解できれば、
フォーム処理の安全性は
一段階上のレベル に到達しています。


次に読むべき記事

▶ 次の記事
6-11 CSRFとは?仕組みと対策

▶ 関連記事
6-9 PHPのバリデーションとは何か

コメント