【PHP】直接アクセスできない送信完了ページの作り方|サンクスページのセキュリティ対策付き
お問い合わせフォームの送信後に表示される「サンクスページ」。
このページ、実はURLを知っていれば誰でも直接アクセスできてしまう…そんな実装、していませんか?
今回は、セッションを使って「正規ルート以外からのアクセスを遮断」する方法をご紹介します。
誰でも簡単に導入できるPHPサンプル付きなので、初心者の方にもおすすめです。
なぜ送信完了ページに直接アクセスできないようにすべきか?
よくある問題点
thanks.html
に直接アクセスすると、メール送信していないのに「送信完了」と表示されてしまう- フォーム入力をバイパスして、完了ページに進めてしまう(スパム的な挙動に見える)
- 送信処理をトリガーとしたCV計測やリード追跡が正確にできなくなる
対策方針
送信処理 send.php
を通った後だけ show_thanks.php
で thanks.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
に入力フィールドを追加
form.php
に入力フィールドを追加:
<label>会社名:</label><br>
<input type="text" name="company"><br><br>
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); ?>">
send.php
にも$company = $_POST['company'];
を追加し、メール文に含めます:
$company = $_POST['company'];
...
$body = "【お名前】$name\\n【会社名】$company\\n【メール】$email\\n...";
- 自動返信メールにも同様に反映:
$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";
【PHPフォーム制作】名前は全角限定!ハニーポットでスパムも防ぐ実用テクニック
6月 24, 2025PHPでの条件分岐のトラブル解決:詳細なURLが適用されない場合の対応
1月 7, 2025ハニーポット法とは?スパム対策の基本テクニック
10月 18, 2024