PHP 安全な電子メール

前節の PHP メールスクリプトには脆弱性があります。

PHP メール注入

まず、前節の PHP コードを見てください:

<html>
<body>
<?php
if (isset($_REQUEST['email']))
//メールが入力されている場合、メールを送信する
  {
  //メールを送信する
  $email = $_REQUEST['email']; 
  $subject = $_REQUEST['subject'];
  $message = $_REQUEST['message'];
  mail("someone@example.com", "Subject: $subject",
  $message, "From: $email" );
  echo "Thank you for using our mail form";
  }
else
//メールが入力されていない場合、フォームを表示する
  {
  echo "<form method='post' action='mailform.php'>
  メール: <input name='email' type='text' /><br />
  件名: <input name='subject' type='text' /><br />
  メッセージ:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

上記のコードには問題があり、認証されていないユーザーがフォームを通じてメールヘッダーにデータを挿入することができます。

もしユーザーがフォームのテキストボックスにこれらのテキストを入力したら、何が起こるか考えてみてください。

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com

mail() 函数は通常、テキストをメールのヘッダーに含めますが、今ではヘッダーには追加の Cc:, Bcc: そして To: フィールドがあります。ユーザーが送信ボタンをクリックすると、これらのすべてのアドレスにメールが送信されます!

PHPでメール注入を防ぐ

メール注入を防ぐ最善の方法は、入力を検証することです。

以下のコードは前節と似ていますが、フォームの email フィールドの入力検証プログラムを追加しています:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() はメールをクリーンアップします 
  
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  //filter_var() はメールを確認します
  
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
if (isset($_REQUEST['email']))
  //「メール」が入力された場合、処理を進める
  //メールアドレスが無効かどうかを確認する
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "不正な入力";
    }
  else
    //メールを送信する
    $email = $_REQUEST['email']; 
    $subject = $_REQUEST['subject'];
    $message = $_REQUEST['message'];
    mail("someone@example.com", "Subject: $subject",
    $message, "From: $email" );
    echo "Thank you for using our mail form";
    }
  }
else
  // if "email" is not filled out, display the form
  echo "<form method='post' action='mailform.php'>
  メール: <input name='email' type='text' /><br />
  件名: <input name='subject' type='text' /><br />
  メッセージ:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

上記のコードでは、PHP フィルタを使用して入力を検証しています:

  • FILTER_SANITIZE_EMAIL から文字列からメールの無効な文字を削除
  • FILTER_VALIDATE_EMAIL メールアドレスの検証

私たちの PHP フィルタこのセクションでは、フィルタに関するさらに詳しい情報を読むことができます。