お問い合わせ用のメール送信フォームを作成します。
フォーム/確認・チェック/送信 それぞれの画面に遷移していきます
mail_form.php(フォーム画面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php session_start(); header("Content-type: text/html; charset=utf-8"); //クリックジャッキング対策 header('X-FRAME-OPTIONS: SAMEORIGIN'); ?> <!DOCTYPE html> <html> <head> <title>メールフォーム</title> <meta charset="utf-8"> </head> <body> <p> 全ての項目が必須です。</p> <form action="mail_check.php" method="post"> <p>名前:<input type="text" name="name"></p> <p>メールアドレス:<input type="text" name="mail" size="50"></p> <p><textarea name="comment" rows="4" cols="40">コメントをどうぞ</textarea></p> <input type="hidden" name="token" value="<?=sha1(session_id())?>"> <input type="submit" value="確認する"> </form> </body> </html> |
7行目
クリックジャッキング対策に関しては下記の関連ページをご参照下さい。
27行目
セッションIDをハッシュ化してそれをトークンとし、クロスサイトリクエストフォージェリ対策を行なっています。詳しくは以下の関連ページをご参照下さい。
mail_check.php(確認・チェック画面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
<?php session_start(); header("Content-type: text/html; charset=utf-8"); //クリックジャッキング対策 header('X-FRAME-OPTIONS: SAMEORIGIN'); //トークン判定 if ($_POST['token'] != sha1(session_id()) ){ echo "不正アクセスの可能性あり"; exit(); } //前後にある半角全角スペースを削除する関数 function spaceTrim ($str) { // 行頭 $str = preg_replace('/^[ ]+/u', '', $str); // 末尾 $str = preg_replace('/[ ]+$/u', '', $str); return $str; } //エラーメッセージの初期化 $errors = array(); if(empty($_POST)) { header("Location: mail_form.php"); exit(); }else{ //POSTされたデータを各変数に入れる $name = isset($_POST['name']) ? $_POST['name'] : NULL; $mail = isset($_POST['mail']) ? $_POST['mail'] : NULL; $comment = isset($_POST['comment']) ? $_POST['comment'] : NULL; //前後にある半角全角スペースを削除 $name = spaceTrim($name); $mail = spaceTrim($mail); $comment = spaceTrim($comment); //名前入力判定 if ($name == ''){ $errors['name'] = "名前が入力されていません。"; }else{ if(mb_strlen($name)>10){ $errors['name_length'] = "名前は10文字以内で入力して下さい。"; } } //メール入力判定 if ($mail == ''){ $errors['mail'] = "メールが入力されていません。"; }else{ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)){ $errors['mail_check'] = "メールアドレスの形式が正しくありません。"; } } //コメント入力判定 if ($comment == ''){ $errors['comment'] = "コメントが入力されていません。"; }else{ if(mb_strlen($comment)>1000){ $errors['comment_length'] = "コメントは1000文字以内で入力して下さい。"; } } } //エラーが無ければセッションに登録 if(count($errors) === 0){ $_SESSION['name'] = $name; $_SESSION['mail'] = $mail; $_SESSION['comment'] = $comment; } ?> <!DOCTYPE html> <html> <head> <title>検索結果</title> <meta charset="utf-8"> </head> <body> <?php if (count($errors) === 0): ?> <form action="mail_send.php" method="post"> <p>名前:<?=htmlspecialchars($name, ENT_QUOTES)?></p> <p>メールアドレス:<?=htmlspecialchars($mail, ENT_QUOTES)?></p> <p><?=nl2br(htmlspecialchars($comment, ENT_QUOTES))?></p> <input type="button" value="戻る" onClick="history.back()"> <input type="hidden" name="token" value="<?=$_POST['token']?>"> <input type="submit" value="送信する"> </form> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <input type="button" value="戻る" onClick="history.back()"> <?php endif; ?> </body> </html> |
フォーム画面から受け取った値をチェックし、問題が無ければセッションにそれぞれの値を登録し、次の送信画面へと引き継ぎます。
10〜13行目
前画面から受け取ったトークンとセッションIDを比べて、クロスサイトリクエストフォージェリ対策を行なっています。
mail_send.php(送信画面)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
<?php session_start(); header("Content-type: text/html; charset=utf-8"); //クリックジャッキング対策 header('X-FRAME-OPTIONS: SAMEORIGIN'); //トークン判定 if ($_POST['token'] != sha1(session_id()) ){ echo "不正アクセスの可能性あり"; exit(); } if(empty($_POST)) { header("Location: mail_form.php"); exit(); } //メールの宛先 $mailTo = 'mymail@sample.com'; //Return-Pathに指定するメールアドレス $returnMail = 'mymail@sample.com'; //セッション変数等を各変数に設定 $name = $_SESSION['name']; $mail = $_SESSION['mail']; $subject = "問い合わせです"; $body = $_SESSION['comment']; mb_language('ja'); mb_internal_encoding('UTF-8'); //Fromヘッダーを作成 $header = 'From: ' . mb_encode_mimeheader($name). ' <' . $mail. '>'; if (mb_send_mail($mailTo, $subject, $body, $header, '-f'. $returnMail)) { //セッション変数を全て解除 $_SESSION = array(); //セッションクッキーの削除 if (isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } //セッションを破棄する session_destroy(); echo "メールが送信されました。"; } else { echo "メールの送信に失敗しました。"; } |