第43回: フォーム受け取り — ユーザー入力を安全に扱うWebの入口

章: 第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)も意識しましょう

次回は バリデーション — 受け取った値が正しい形式かをチェックする防波堤を学びます。

Related Articles