章: 第5章: Web・DB・セキュリティ
フォームから受け取った値をそのまま表示・処理していませんか?それがXSSやデータ破損の原因になります。
問題と解決策
echo $_POST['name'] と書くだけでも動きますが、<script>alert('XSS')</script> のような文字列を入力されると、そのままHTMLに出力されてスクリプトが実行されてしまいます。
また、フォームが送信されていない状態でページを開いたとき、$_POST['name'] は未定義でPHPがWarningを出します。Null合体演算子 ?? で安全なデフォルト値を設定し、出力時は必ず htmlspecialchars() でエスケープすることが基本です。
フォーム受け取り方法の比較
| パターン | 問題点 | 推奨度 |
echo $_POST['name'] |
XSSリスク・未定義Warning | ❌ 危険 |
$_POST['name'] ?? '' |
エスケープなしは依然XSSリスク | △ 不十分 |
htmlspecialchars($_POST['name'] ?? '', ENT_QUOTES, 'UTF-8') |
安全な出力 | ✅ 推奨 |
チェックポイント:
htmlspecialchars()を使うとき、第2引数をENT_QUOTES、第3引数を'UTF-8'にしていますか?どちらかが抜けると防御が不完全になります。
コードサンプル
<?php
$name = $_POST['name'] ?? '';
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
まとめ & 次のステップ
- フォーム値は
?? ''でデフォルト値を設定し、未定義Warningを防ぎます - 出力時は必ず
htmlspecialchars()でHTMLエスケープします ENT_QUOTESと'UTF-8'をセットで指定するのが正しい使い方です- GETとPOSTの使い分け(状態変更はPOST、閲覧はGET)も意識しましょう
次回は バリデーション — 受け取った値が正しい形式かをチェックする防波堤を学びます。