PHP

PHPでフォーム送信を処理する基本:POSTデータの受け取りと安全な入力処理

PHPでフォームから送信されたPOSTデータを受け取り、入力値を検証し、画面へ安全に表示するまでの基本手順を、初学者向けに整理します。

この記事でわかること

  • フォームの送信先とHTTPメソッドを設定できる
  • PHPでPOSTデータを受け取り、未入力や形式を検証できる
  • 出力時のエスケープによって意図しないHTML解釈を防ぐ
  • 入力値の検証とエスケープは目的が異なることを理解できる

フォーム送信の全体像を理解する

HTMLフォームでは、form要素のactionで送信先、methodでHTTPメソッドを指定します。各入力項目にはname属性が必要です。ブラウザーが入力値をリクエストとして送信し、PHPが$_POSTなどから値を受け取って処理します。PHP公式のフォーム処理

HTML
<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
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim((string)($_POST['name'] ?? ''));

    // 例: nameが送信されていない場合は空文字列になる
    echo $name;
}
?>
// 期待される挙動: POST以外のアクセスでは、POSTデータの処理を行わない。

null合体演算子(??)を使うと、キーが存在しない場合のNoticeを避けながら初期値を設定できます。trimで前後の空白を除去し、後続の検証条件をそろえます。

入力値を検証する

検証では、アプリケーションが受け入れる条件を確認します。たとえば、必須入力、文字数、メールアドレスの形式などです。検証に失敗した場合はエラーメッセージを保持し、フォームを再表示します。

観点入力値の検証出力時のエスケープ
目的受け入れ可能な値か確認するHTMLとして意図しない解釈を防ぐ
実施タイミング値を受け取った直後などHTMLへ埋め込む直前
代表的な処理必須チェック、文字数確認、filter_varhtmlspecialchars
防げる問題形式不正や業務ルール違反HTML解釈を利用したスクリプト実行など
入力値の検証と出力時のエスケープの違い

検証に通った値でも、表示時には別途エスケープが必要です。検証とエスケープは目的が異なるため、どちらか一方だけで済ませないようにします。

画面へ表示するときにエスケープする

ユーザー入力をHTML本文や属性へ再表示するときは、htmlspecialcharsを使います。HTMLの文脈では、文字コードを指定して出力先に合わせて処理します。PHP公式のhtmlspecialchars解説

PHP
<?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
<?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出力時のエスケープだけで、フォーム処理全体の安全性が確保されるわけではありません。

参考