phpでメールフォームの作り方(バリデーション付き)

MacBook Pro beside white papers and plant

PHPを使用してメールフォームを作成する場合、以下の手順に従ってください。

1.HTMLフォームを作成します。次のようなフォームを作成することができます。

<form method="post" action="sendmail.php">
  <label for="name">お名前:</label>
  <input type="text" name="name" id="name"><br>

  <label for="email">メールアドレス:</label>
  <input type="email" name="email" id="email"><br>

  <label for="message">メッセージ:</label>
  <textarea name="message" id="message"></textarea><br>

  <input type="submit" value="送信">
</form>

2.バリデーションを行います。フォームに入力された値が正しい形式であるかどうかを確認するために、以下のようなバリデーションを行うことができます。

<?php
// フォームが送信された場合にのみバリデーションを行う
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $name = $_POST['name'];
  $email = $_POST['email'];
  $message = $_POST['message'];

  // 名前が入力されているかどうかを確認する
  if (empty($name)) {
    $errors[] = 'お名前を入力してください。';
  }

  // メールアドレスが正しい形式で入力されているかどうかを確認する
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = '正しいメールアドレスを入力してください。';
  }

  // メッセージが入力されているかどうかを確認する
  if (empty($message)) {
    $errors[] = 'メッセージを入力してください。';
  }

  // エラーがない場合はメールを送信する
  if (empty($errors)) {
    // メールを送信する処理を記述する
  }
}
?>

3.バリデーションエラーを表示します。フォームに入力された値が正しくない場合は、エラーメッセージを表示することができます。

<?php if (!empty($errors)): ?>
  <ul>
    <?php foreach ($errors as $error): ?>
      <li><?php echo $error; ?></li>
    <?php endforeach; ?>
  </ul>
<?php endif; ?>

4.メールを送信します。バリデーションエラーがない場合は、フォームに入力された値を使用してメールを送信することができます。具体的な方法は、メール送信ライブラリを使用するか、PHPのmail関数を使用するかなどの方法があります。

以下のようなPHPコードを追加します。

<?php
// フォームが送信された場合にのみバリデーションを行う
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $name = $_POST['name'];
  $email = $_POST['email'];
  $message = $_POST['message'];

  // 名前が入力されているかどうかを確認する
  if (empty($name)) {
    $errors[] = 'お名前を入力してください。';
  }

  // メールアドレスが正しい形式で入力されているかどうかを確認する
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = '正しいメールアドレスを入力してください。';
  }

  // メッセージが入力されているかどうかを確認する
  if (empty($message)) {
    $errors[] = 'メッセージを入力してください。';
  }

  // エラーがない場合はメールを送信する
  if (empty($errors)) {
    // 送信先のメールアドレスを指定する
    $to = 'your_email@example.com';

    // メールの件名を指定する
    $subject = 'お問い合わせがありました';

    // メールの本文を作成する
    $body = "お名前:{$name}\nメールアドレス:{$email}\n\n{$message}";

    // メールを送信する
    if (mail($to, $subject, $body)) {
      // 送信成功のメッセージを表示する
      echo 'メールを送信しました。';
    } else {
      // 送信失敗のメッセージを表示する
      echo 'メールの送信に失敗しました。';
    }
  }
}
?>

このコードでは、mail関数を使用してメールを送信しています。ただし、この方法はサーバーの設定によっては動作しないことがあります。その場合は、別のメール送信ライブラリを使用するか、サードパーティのメールサービスを利用することを検討してください。

以上が、PHPでメールフォームを作成する手順です。ただし、このコードはセキュリティ上の問題を抱えているため、実際のWebサイトで使用する場合は、入力値のサニタイズやCSRF対策などのセキュリティ対策を施す必要があります。

以下は、セキュリティ対策の一例です。

1.入力値のサニタイズ

ユーザーがフォームに入力した値を直接使用すると、悪意のあるユーザーがスクリプトを注入するなどの攻撃を行う可能性があります。これを防ぐために、入力値を適切にサニタイズする必要があります。

例えば、以下のような関数を使用して入力値をサニタイズすることができます。

function sanitize($value) {
  return htmlspecialchars(trim($value), ENT_QUOTES, 'UTF-8');
}

この関数では、htmlspecialchars関数を使用してHTMLエスケープを行い、trim関数を使用して余分なスペースを取り除いています。また、ENT_QUOTESフラグを指定することで、シングルクオートとダブルクオートの両方をエスケープするようにしています。

2.CSRF対策

CSRF(Cross-Site Request Forgery)とは、Webサイト上で認証されたユーザーの名前を借りて、悪意のあるユーザーが勝手にリクエストを送信する攻撃のことです。これを防ぐために、フォームにCSRFトークンを埋め込むことが推奨されています。

CSRFトークンは、フォームを表示する際に生成され、フォーム送信時にトークンの一致を確認することで、正規のユーザーからのリクエストであることを確認します。

以下は、CSRFトークンを使用したフォームの例です。

<?php
session_start();

// CSRFトークンを生成する
$token = bin2hex(random_bytes(32));
$_SESSION['token'] = $token;
?>

<form method="post" action="sendmail.php">
  <input type="hidden" name="token" value="<?php echo $token; ?>">

  <!-- その他のフォーム要素 -->
</form>

この例では、random_bytes関数を使用してランダムなバイト列を生成し、bin2hex関数を使用して16進数の文字列に変換しています。生成されたトークンは、$_SESSION変数に保存され、フォームに隠し要素として埋め込まれます。

フォーム送信時には、受け取ったトークンが正しいかどうかを確認する必要があります。

<?php
session_start();

// CSRFトークンを確認する
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['token'])) {
  if ($_POST['token'] !== $_SESSION['token']) {
    // CSRF攻撃の可能性があるため、エラー処理を行う
  } else {
    // フォームの処理を続行する
  }
}
?>

3.入力値の検証

フォームに入力された値が、正しい形式であるかどうかを検証することも重要です。例えば、電話番号や郵便番号など、特定の形式に従っていることを確認する必要があります。

PHPには、正規表現を使用して入力値の検証を行う関数が用意されています。例えば、以下のような関数を使用して、電話番号の形式が正しいかどうかを確認することができます。

function validate_phone_number($value) {
  return preg_match('/^0\d{9,10}$/', $value);
}

この関数では、preg_match関数を使用して、入力値が指定された正規表現に一致するかどうかを確認しています。

以上が、PHPでメールフォームを作成する際のセキュリティ対策の一例です。セキュリティ対策は、常に最新の情報に基づいて適切に行う必要があります。また、セキュリティの専門家に相談することをお勧めします。

シェアする

上にスクロール