フォーム送信の全体像を理解する
HTMLフォームでは、form要素のactionで送信先、methodでHTTPメソッドを指定します。各入力項目にはname属性が必要です。ブラウザーが入力値をリクエストとして送信し、PHPが$_POSTなどから値を受け取って処理します。PHP公式のフォーム処理
<form action="contact.php" method="post">
<label>
名前
<input type="text" name="name">
</label>
<button type="submit">送信</button>
</form>
<!-- 送信時、nameの入力値がcontact.phpへPOSTされる -->POSTを使うと、入力値をURLのクエリ文字列に含めずに送信できます。ただし、POSTだけで通信内容が暗号化されるわけではありません。通信の保護にはHTTPSも必要です。
PHPでPOSTデータを受け取る
PHPでは、フォームのPOSTデータを$_POSTから参照できます。処理前に$_SERVER['REQUEST_METHOD']を確認し、未送信のキーを直接参照しないことが基本です。$_POSTは、一般的なフォームで使われるapplication/x-www-form-urlencodedやmultipart/form-dataのデータを扱います。PHP公式の$_POST解説/$_SERVERのREQUEST_METHOD
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim((string)($_POST['name'] ?? ''));
// 例: nameが送信されていない場合は空文字列になる
echo $name;
}
?>
// 期待される挙動: POST以外のアクセスでは、POSTデータの処理を行わない。null合体演算子(??)を使うと、キーが存在しない場合のNoticeを避けながら初期値を設定できます。trimで前後の空白を除去し、後続の検証条件をそろえます。
入力値を検証する
検証では、アプリケーションが受け入れる条件を確認します。たとえば、必須入力、文字数、メールアドレスの形式などです。検証に失敗した場合はエラーメッセージを保持し、フォームを再表示します。
| 観点 | 入力値の検証 | 出力時のエスケープ |
|---|---|---|
| 目的 | 受け入れ可能な値か確認する | HTMLとして意図しない解釈を防ぐ |
| 実施タイミング | 値を受け取った直後など | HTMLへ埋め込む直前 |
| 代表的な処理 | 必須チェック、文字数確認、filter_var | htmlspecialchars |
| 防げる問題 | 形式不正や業務ルール違反 | HTML解釈を利用したスクリプト実行など |
検証に通った値でも、表示時には別途エスケープが必要です。検証とエスケープは目的が異なるため、どちらか一方だけで済ませないようにします。
画面へ表示するときにエスケープする
ユーザー入力をHTML本文や属性へ再表示するときは、htmlspecialcharsを使います。HTMLの文脈では、文字コードを指定して出力先に合わせて処理します。PHP公式のhtmlspecialchars解説
<?php
$name = '"<太郎>"';
$safeName = htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
?>
<input type="text" name="name" value="<?= $safeName ?>">
<!-- 期待される挙動: < や " などがHTMLの特殊文字として解釈されず、文字として表示される -->エスケープは基本的に保存前ではなく、出力先の文脈に応じて行います。HTML以外のJavaScript、URL、SQLなどへ値を埋め込む場合は、htmlspecialcharsを機械的に使わず、それぞれの文脈に適した対策を選びます。
受け取り・検証・再表示を組み合わせる
<?php
$name = '';
$errors = [];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim((string)($_POST['name'] ?? ''));
if ($name === '') {
$errors[] = '名前を入力してください。';
} elseif (mb_strlen($name) > 100) {
$errors[] = '名前は100文字以内で入力してください。';
}
if (!$errors) {
// ここで保存処理やメール送信などを行う
echo '送信内容を受け付けました。';
}
}
if ($errors):
foreach ($errors as $error):
echo '<p>' . htmlspecialchars($error, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . '</p>';
endforeach;
endif;
?>
<!-- 期待される挙動: エラー時はメッセージを表示し、正常時は後続処理へ進む -->この例では、POST判定、値の取得、検証、エラー表示、正常時の処理を分けています。フォームへ入力値を再表示する場合も、次のように必ずエスケープします。value=""
実務では、CSRF対策、認証・認可、データ保存時の制約、二重送信対策なども別途必要です。POSTデータの受け取りやHTML出力時のエスケープだけで、フォーム処理全体の安全性が確保されるわけではありません。