受け付けフォーム3

受け付けフォームの続きの続きです。入力内容をCSVファイルにアペンドし,確認メールを出します。

最初のページに戻ってやりなおしてください。

ソース

あらかじめ apply.csv というファイルを作り,Apacheに書き込めるようにしておきます。ただし,このままでは丸見えです。どうすればいいか考えてください(答えは下のほうにあります)。

<?php
  if (isset($_POST['email'], $_POST['name'], $_POST['memo'])) {
    $f = fopen("apply.csv", "a");
    fwrite($f, "\"{$_POST['email']}\",\"{$_POST['name']}\",\"{$_POST['memo']}\"\r\n");
    fclose($f);
    mb_send_mail(
      $_POST['email'],            // 宛先
      "申込",                     // 件名
      "メール: {$_POST['email']}\n氏名: {$_POST['name']}\n備考:\n{$_POST['memo']}\n", // 本文
      "From: あなたのメアド\nCc: あなたのメアド",
      "-f あなたのメアド");       // エラー宛先(Return-Path)
    echo "<p>受け付けました。</p>\n";
    $x = htmlspecialchars($_POST['email']);
    echo "<p>確認メールを $x に送りました。</p>\n";
  } else {
    echo "<p><a href=\"apply.html\">最初のページ</a>に戻ってやりなおしてください。</p>\n";
  }
?>

「あなたのメアド」は実際のメールアドレスにしてください。

セキュリティ上の問題

このままでは apply.csv というファイルを見つけられてしまったら,個人情報が丸見えになります。この対策としては以下のようなことが考えられます。

CSVファイル作成上の問題

CSVファイル(コンマ区切りのテキストファイル)は,念のため各項目を "" で囲んでいます。こうすれば項目内に改行があっても大丈夫です。ただし,項目に " がすでに含まれている場合は,規約によりそれを "" に置き換える必要があります。具体的には次のような処理が必要です:

  $x = str_replace('"', '""', $_POST['memo']);

あるいは,別の文字で置き換えておいてもいいでしょう。次の例は,項目中の改行を人間が見やすい別の文字で置き換えます:

  $x = str_replace(array("\r\n", "\n", "\r"), '◆', $_POST['memo']);

CSRF対策

悪意あるリンクを踏むと apply3.php に飛んで不本意な登録をしてしまうような仕掛けの対策としては,ごく簡単には,

  if (isset($_POST['email'], $_POST['name'], $_POST['memo'])) {

  if ($_SERVER['HTTP_REFERER'] == 'http://oku.edu.mie-u.ac.jp/~okumura/php/apply2.php' &&
      isset($_POST['email'], $_POST['name'], $_POST['memo'])) {

に変えることです。ただ,HTTP_REFERER を正しく送信しないブラウザがあると厄介なので,ここでは上の対策をしていません。セッション管理を使う対策が一般的です。


Last modified: