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();
}
?>

小中学生向けプログラミング教材「デジタネ」

コメントを残す