DBを使わない簡易的なPHPのメールフォーム(仕上げ)
最終的にメールフォームの送信までを記述しましたが、ここに対してもXSS攻撃の対策は必要との事で、以下のように記述
<?php
session_start();
$mode = 'input';
$errmessage = array();
if (isset($_POST['back'])) {
$mode = 'input';
} elseif (isset($_POST['confirm'])) {
if (!$_POST['fullname']) {
$errmessage[] = '名前を入力してください。';
} elseif (mb_strlen($_POST['fullname']) > 50) {
$errmessage[] = '名前は50文字以内にしてください。';
}
$_SESSION['fullname'] = htmlspecialchars($_POST['fullname'], ENT_QUOTES, "UTF-8");
if (!$_POST['email']) {
$errmessage[] = 'emailを入力してください。';
} elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errmessage[] = 'emailの形式が不正です。';
} elseif (mb_strlen($_POST['email']) > 100) {
$errmessage[] = 'emailは100文字以内に収めてください。';
}
$_SESSION['email'] = htmlspecialchars($_POST['email'], ENT_QUOTES, "UTF-8");
if (!$_POST['message']) {
$errmessage[] = '本文を入力してください。';
} elseif (mb_strlen($_POST['message']) > 500) {
$errmessage[] = '本文は500文字以内に収めてください。';
}
$_SESSION['message'] = htmlspecialchars($_POST['message'], ENT_QUOTES, "UTF-8");
if ($errmessage) {
$mode = 'input';
} else {
$mode = 'confirm';
$token = bin2hex(random_bytes(32));
$_SESSION['token'] = $token;
}
} elseif (isset($_POST['send'])) {
// 以下の記述を追加
if (isset($_POST['token']) != $_SESSION['token']) {
$errmessage[] = '不正な処理が行われました';
$mode = 'input';
} else {
$name = htmlspecialchars($_SESSION['name'], ENT_QUOTES, "UTF-8");
$e_mail = htmlspecialchars($_SESSION['email'], ENT_QUOTES, "UTF-8");
$message = htmlspecialchars($_SESSION['message'], ENT_QUOTES, "UTF-8");
$from = '送信元メールアドレス';
$to = '送信先メールアドレス';
$subject = 'メールフォームからの問い合わせ';
$body = <<<EOT
名前: {$name}
e-mail: {$e_mail}
本文: {$message}
EOT;
mb_send_mail($to, $subject, $body, "From: {$from}");
$mode = 'send';
}
} else {
$errmessage = array();
}
?>