【PHP】直接アクセスできない送信完了ページの作り方|サンクスページのセキュリティ対策付き

お問い合わせフォームの送信後に表示される「サンクスページ」。
このページ、実はURLを知っていれば誰でも直接アクセスできてしまう…そんな実装、していませんか?

今回は、セッションを使って「正規ルート以外からのアクセスを遮断」する方法をご紹介します。
誰でも簡単に導入できるPHPサンプル付きなので、初心者の方にもおすすめです。

なぜ送信完了ページに直接アクセスできないようにすべきか?

よくある問題点

  • thanks.html に直接アクセスすると、メール送信していないのに「送信完了」と表示されてしまう
  • フォーム入力をバイパスして、完了ページに進めてしまう(スパム的な挙動に見える)
  • 送信処理をトリガーとしたCV計測やリード追跡が正確にできなくなる

対策方針

送信処理 send.php を通った後だけ show_thanks.phpthanks.html を読み込む構造にします。
これにより、直接URLを叩いても完了ページは表示されません

ファイル構成

ファイル名説明
form.php入力フォーム画面
confirm.php確認画面
send.phpメール送信処理とセッションセット
show_thanks.phpセッションチェック後 thanks.html を表示
thanks.html実際の完了メッセージHTML(自由に編集OK)

show_thanks.php のコード(セッション制御)

<?php
session_start();
if (!isset($_SESSION['sent']) || $_SESSION['sent'] !== true) {
header("Location: form.php");
exit;
}
unset($_SESSION['sent']);
readfile("thanks.html");
?>

ポイント解説

  • session_start(); → セッションを開始
  • $_SESSION['sent']send.php で送信成功時にセットされるフラグ
  • isset() & チェック → フラグが無ければ form.php にリダイレクト
  • unset() → 1度限りの表示にする(再アクセスを防止)
  • readfile() → 完了画面として thanks.html を読み込み

send.php 側の対応(セッションセット)

if (mb_send_mail(...)) {
$_SESSION['sent'] = true;
header("Location: show_thanks.php");
exit;
}

送信処理成功後に、セッション変数 $_SESSION['sent'] = true; をセットしてから
show_thanks.php へリダイレクトします。

完了ページ(thanks.html)のデザインは自由に!

完了メッセージを HTMLでカスタマイズできるので、
ブランドサイトやLPに合わせて以下のような工夫が可能です:

<h1>送信が完了しました</h1>
<p>お問い合わせいただきありがとうございます。</p>
<p>3営業日以内にご連絡させていただきます。</p>

まとめ:サンクスページにこそセキュリティを

よくある実装セキュアな実装
thanks.html に直接遷移show_thanks.php 経由+セッションチェック
何度でもアクセス可能一度のみ表示(セッション削除)
本当に送信されたか不明フローが保証されている

サンクスページを適切に制御することで、フォームの信頼性がグッと上がります。

カスタマイズ方法

追加したい場合の手順

form.phpに入力フィールドを追加

  1. form.phpに入力フィールドを追加:
<label>会社名:</label><br>
<input type="text" name="company"><br><br>
  1. confirm.php にも表示と hidden を追加:
<p>会社名:<?php echo htmlspecialchars($_POST['company'], ENT_QUOTES); ?></p>
<input type="hidden" name="company" value="<?php echo htmlspecialchars($_POST['company'], ENT_QUOTES); ?>">
  1. send.php にも $company = $_POST['company']; を追加し、メール文に含めます:
$company = $_POST['company'];
...
$body = "【お名前】$name\\n【会社名】$company\\n【メール】$email\\n...";
  1. 自動返信メールにも同様に反映:
$reply_body = <<<EOD
{$name} 様

この度はお問い合わせいただきありがとうございます。
以下の内容で受け付けました。

--------------------
【お名前】$name
【会社名】$company
【メール】$email
【お問い合わせ内容】
$message
--------------------
EOD;

削除したい場合

該当項目(例:tel)に関するフォーム・hidden・変数・本文から全ての記述を削除すればOKです。

カスタマイズ②:必須項目の設定変更

既存のフォーム例(form.php):

<input type="email" name="email" required>

HTMLの required 属性を外すと任意項目に変更されます:

<input type="email" name="email">

または、send.php 側でもチェック可能:

if (empty($email)) {
echo "メールアドレスは必須です。";
exit;
}

→ JSだけでなくサーバー側でもチェックしておくと、セキュリティ的に◎。

カスタマイズ③:完了画面の編集(thanks.html

HTMLファイルなので、自由にデザイン可能です:

<h1>お問い合わせありがとうございました</h1>
<p>ご入力いただいた内容は送信されました。</p>
<p>3営業日以内にご連絡いたします。</p>
<a href="/" class="btn">トップページへ戻る</a>
  • 画像やスタイルシートを読み込むことで、ブランド感を反映可能。
  • ボタンで遷移先を指定するのもおすすめ。

カスタマイズ④:送信者名やメール宛先の変更(send.php

$to = "your@example.com"; // 管理者宛先
$headers = "From: $email"; // 差出人を入力者のアドレスに設定

差出人を固定にしたい場合:

$headers = "From: お問い合わせ窓口 <no-reply@example.com>";

カスタマイズ⑤:BCC・複数人への送信(send.php

$headers .= "\\r\\nBcc: backup@example.com, another@example.com";

完成版はこちら

サンプル完成版をダウンロード