前のセクションの PHP 電子メール スクリプトには脆弱性があります。
まず、前の章の PHP コードを見てください。
<html><head><meta charset="utf-8"><title>コーダー チュートリアル (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // email パラメータを受信した場合、メールを送信します。 // メールを送信します $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "メールは正常に送信されました";} 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>
上記のコードの問題は、権限のないユーザーが入力フォームを通じて電子メール ヘッダーにデータを挿入できることです。
ユーザーがフォームの入力ボックスに次のテキストを電子メールに追加するとどうなりますか?
[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
いつものように、mail() 関数は上記のテキストを電子メール ヘッダーに挿入するため、ヘッダーには追加の Cc:、Bcc:、および To: フィールドが追加されます。ユーザーが送信ボタンをクリックすると、この電子メールは上記のすべてのアドレスに送信されます。
電子メールの挿入を防ぐ最善の方法は、入力を検証することです。
次のコードは前の章のコードと似ていますが、ここではフォーム内の電子メール フィールドを検出する入力バリデータを追加しています。
<html><head><meta charset="utf-8"><title>コーダー チュートリアル (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) 電子メールをフィルタリングする // FILTER_SANITIZE_EMAIL を使用する $field=filter_var($field, FILTER_SANITIZE_EMAIL) //filter_var() 電子メールをフィルタリングする // FILTER_VALIDATE_EMAIL を使用します if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE }}if (isset($_REQUEST['email'])){ // email パラメータを受信した場合、メールを送信します// メールが合法かどうかを判断します $mailcheck = spamcheck($_REQUEST['email']); ($mailcheck==FALSE) { echo "不正な入力" } else { // メールを送信 $email = $_REQUEST['subject'] ;メッセージ'] ; mail("[email protected]", "件名: $subject", $message, "From: $email" );メールフォームを使用する場合"; }}else{ // email パラメーターがない場合は、フォームを表示します echo "<form method='post' action='mailform.php'> Email: <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 フィルタをご覧ください。