PHP 安全な電子メール
- 前のページ PHP E-mail
- 次のページ 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 フィルタこのセクションでは、フィルタに関するさらに詳しい情報を読むことができます。
- 前のページ PHP E-mail
- 次のページ PHP エラ