重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

phpのメール問い合わせフォームでエラーが・・

phpでメール問い合わせフォームを作り、テストプレイしたのですが、
CSRFトークンが無効です
とエラー画面が出ます。。どう修正すればいいでしょうか、、
phpコードは下記です。
<?php
session_start();
session_regenerate_id(true); // セッションID再生成
$mode = 'input'; // 初期状態は入力画面
$errmessage = array();

// CSRFトークンの生成
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32)); // セッションにトークンを格納
}

// 送信ボタンが押された場合
if (isset($_POST['send']) && $_POST['send']) {
// トークンの存在確認
if (empty($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
die('CSRFトークンが無効です');
}

// 入力チェック
if (empty($_POST['fullname'])) {
$errmessage[] = "名前を入力してください";
} else if (mb_strlen($_POST['fullname']) > 20) {
$errmessage[] = "名前は20文字以内にしてください";
}
$_SESSION['fullname'] = htmlspecialchars($_POST['fullname'], ENT_QUOTES);

if (empty($_POST['email'])) {
$errmessage[] = "Eメールを入力してください";
} else if (mb_strlen($_POST['email']) > 200) {
$errmessage[] = "Eメールは200文字以内にしてください";
} else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errmessage[] = "メールアドレスが不正です";
}
$_SESSION['email'] = htmlspecialchars($_POST['email'], ENT_QUOTES);

if (empty($_POST['message'])) {
$errmessage[] = "お問い合わせ内容を入力してください";
} else if (mb_strlen($_POST['message']) > 500) {
$errmessage[] = "お問い合わせ内容は500文字以内にしてください";
}
$_SESSION['message'] = htmlspecialchars($_POST['message'], ENT_QUOTES);

// エラーがなければ送信処理
if (empty($errmessage)) {
// メール送信処理
$message = "お問い合わせを受け付けました \r\n"
. "名前: " . htmlspecialchars($_SESSION['fullname'], ENT_QUOTES) . "\r\n"
. "Eメール: " . htmlspecialchars($_SESSION['email'], ENT_QUOTES) . "\r\n\n"
. "お問い合わせ内容:\r\n" . preg_replace("/\r\n|\r|\n/", "\r\n", htmlspecialchars($_SESSION['message'], ENT_QUOTES));

// ユーザーへの確認メール送信
mail($_SESSION['email'], 'お問い合わせありがとうございます', $message);
// 管理者への通知メール送信
mail('aaaaaa@gmail.com', 'お問い合わせがありました', $message);

// セッションをクリアして完了画面を表示
$_SESSION = array();
$mode = 'send';
}
} else {
// 入力画面
$mode = 'input';
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>お問い合わせフォーム</title>
</head>
<body>
<?php if ($mode == 'input') { ?>
<!-- 入力画面 -->
<?php
if ($errmessage) {
echo '<div style="color:red;">';
echo implode('<br>', array_map('htmlspecialchars', $errmessage));
echo '</div>';
}
?>
<form action="contactform.php" method="post">
名前<input type="text" name="fullname" value="<?php echo $_SESSION['fullname'] ?? ''; ?>"><br>
Eメール<input type="email" name="email" value="<?php echo $_SESSION['email'] ?? ''; ?>"><br>
お問い合わせ内容<br>
<textarea cols="40" rows="8" name="message"><?php echo $_SESSION['message'] ?? ''; ?></textarea><br>
<!-- トークンの送信 -->
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<input type="submit" name="send" value="送信" />
</form>
<?php } else if ($mode == 'send') { ?>
<!-- 完了画面 -->
<p>送信しました。お問い合わせありがとうございました。</p>
<?php } ?>
</body>
</html>

A 回答 (1件)

session_regenerate_id(true) にて古いセッションを削除したので、


$_SESSION['token'] が削除され、
その後のトークン存在確認が失敗していると思われます。

セッションの削除は、必要なセッション読み取りを終えた後で行いましょう。

参考)
https://www.php.net/manual/ja/function.session-r …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A