お問い合わせフォーム
フォームにトークンを作る
フォーム「〇〇.php」
トークン
入力欄「お名前」
メール欄「メールアドレス」
自由記入欄「メッセージ」
送信ボタン「送信」
<?php
session_start();
if (!isset($_SESSION['CSRFトークン']))
{$_SESSION['CSRFトークン'] = bin2hex(random_bytes(32));}
?>
<form action="○○.php" method="POST">
<input type="hidden" name="CSRFトークン" value="<?= htmlspecialchars($_SESSION['CSRFトークン'], ENT_QUOTES, 'UTF-8'); ?>">
<label>お名前:</label><br>
<input type="text" name="お名前"><br><br>
<label>メールアドレス:</label><br>
<input type="email" name="メール"><br><br>
<label>メッセージ:</label><br>
<textarea name="メッセージ" rows="5" cols="40"></textarea><br><br>
<input type="submit" value="送信">
</form>
メールを送るPHP 〇〇.php
トークン確認
お名前=【お名前】
メッセージ=【メッセージ】
メール=【メール】
ヘッダーインジェクション対策
値の検証
venderの中にあるautoloadのファイルを使う(階層に注意)
同じ階層にある.ENVファイルを使う
日本語に対応させる
サーバー名
メールアドレス
パスワード
送信者のメールアドレス
受信者のメールアドレス
メールタイトル
メール本文
メール送る
失敗時エラーを表示
※composerをダウンロードする。
※メールを送るためにPHPMailerが必要。ターミナルにcomposer require phpmailer/phpmailerを入れるとcomposerを使ってPHPMailerがダウンロードできる。
※$_ENVを使うためにvlucasが必要。ターミナルに composer require vlucas/phpdotenを入れるとcomposerを使ってvlucasをダウンロードできる。
<?php
session_start();
if (!isset($_POST['csrf_token']) ||$_POST['CSRFトークン'] !== $_SESSION['CSRFトークン']) {
die('CSRFトークンが一致しません。');
}
function 枠($文字){return htmlspecialchars ($文字, ENT_QUOTES, 'UTF-8', false);}
$お名前= 枠($_POST['お名前']);
$メッセージ= 枠($_POST['メッセージ']);
$メール=str_replace(array("\r", "\n"), '', $_POST['メール']);
if (!filter_var($メール, FILTER_VALIDATE_EMAIL)) {echo "不正なメールアドレスです";exit;}
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
try{
$mail = new PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->Encoding = 'base64';
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = 'smtp.○○○.jp';
$mail->Username = '〇〇@〇〇';
$mail->Password = $_ENV['PASS'];
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom($メール, '送信者名');
$mail->addAddress('〇〇@〇〇', '受信者名');
$mail->Subject = "お問い合わせ: " . $お名前;
$mail->Body ="名前: $お名前\nメール: $メール\n\nメッセージ:\n$メッセージ";
$mail->send();
} catch (Exception $e) {
echo "メール送信に失敗しました: {$mail->ErrorInfo} ({$e->getMessage()})";
}
パスワードを保存する.ENVファイル
PASS=〇△×□○△
※ファイル名は〇〇.ENVにするのではなく.ENVにする。