2017-02-19 12 views
0

PHPコンタクトフォームは、ページがリフレッシュされるたびに電子メールを送信します。ユーザーがメッセージを一度送信してからもう一度更新すると、同じメッセージが再度送信されます。これは、ページがリフレッシュされるたびに発生します。PHPコンタクトフォームページをリフレッシュするたびに電子メールを送信

if (isset($_POST['submit'])) { 
    if ($_POST['email'] == '' || $_FILES['file_upload'] == '' || $_POST["fname"] == '' || $_POST["lname"] == '' || $_POST["message"] == '') { 
     echo '<p class="red-info">Please Fill All The Fields</p>'; 

    } else { 

     $from_email  = $_POST['email']; //from mail, it is mandatory with some hosts 
     $recipient_email = '[email protected]'; //recipient email (most cases it is your personal email) 

     //Capture POST data from HTML form and Sanitize them, 
     $sender_fname = filter_var($_POST["fname"], FILTER_SANITIZE_STRING); //sender name 
     $sender_lname = filter_var($_POST["fname"], FILTER_SANITIZE_STRING); //sender name 
     $sender_phone_1 = filter_var($_POST["phone_1"], FILTER_SANITIZE_STRING); //sender name 
     $sender_phone_2 = filter_var($_POST["phone_2"], FILTER_SANITIZE_STRING); //sender name 
     $sender_phone_3 = filter_var($_POST["phone_3"], FILTER_SANITIZE_STRING); //sender name 
     $sender_phone = $sender_phone_1 . ' ' . $sender_phone_2 . ' ' . $sender_phone_3; //sender name 
     $reply_to_email = filter_var($_POST["email"], FILTER_SANITIZE_STRING); //sender email used in "reply-to" header 
     $subject  = 'Contact Form'; //get subject from HTML form 
     $message  = filter_var($_POST["message"], FILTER_SANITIZE_STRING); //message 

     /* //don't forget to validate empty fields 
     if(strlen($sender_name)<1){ 
     die('Name is too short or empty!'); 
     } 
     */ 

     //Get uploaded file data 
     $file_tmp_name = $_FILES['file_upload']['tmp_name']; 
     $file_name  = $_FILES['file_upload']['name']; 
     $file_size  = $_FILES['file_upload']['size']; 
     $file_type  = $_FILES['file_upload']['type']; 
     $file_error = $_FILES['file_upload']['error']; 

     if ($file_error > 0) { 
      die('Upload error or No files uploaded'); 
     } 
     //read from the uploaded file & base64_encode content for the mail 
     $handle = fopen($file_tmp_name, "r"); 
     $content = fread($handle, $file_size); 
     fclose($handle); 
     $encoded_content = chunk_split(base64_encode($content)); 

     $boundary = md5("sanwebe"); 
     //header 
     $headers = "MIME-Version: 1.0\r\n"; 
     $headers .= "From:" . $from_email . "\r\n"; 
     $headers .= "Reply-To: " . $reply_to_email . "" . "\r\n"; 
     $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 

     //plain text 
     $body = "--$boundary\r\n"; 
     $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"; 
     $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
     $body .= "<br />First Name:" . $sender_fname; 
     $body .= "<br />Last Name:" . $sender_lname; 
     $body .= "<br />Phone:" . $sender_phone; 
     $body .= "<br />Message:"; 
     $body .= chunk_split(base64_encode($message)); 

     //attachment 
     $body .= "--$boundary\r\n"; 
     $body .= "Content-Type: $file_type; name=" . $file_name . "\r\n"; 
     $body .= "Content-Disposition: attachment; filename=" . $file_name . "\r\n"; 
     $body .= "Content-Transfer-Encoding: base64\r\n"; 
     $body .= "X-Attachment-Id: " . rand(1000, 99999) . "\r\n\r\n"; 
     $body .= $encoded_content; 

     $sentMail = mail($recipient_email, $subject, $body, $headers); 
     if (isset($sentMail)) //output success or failure messages 
      { 
      echo '<p class="green-info">Your Email Has Been Submitted!We will contact soon.</p>'; 
      echo "<script>document.contact.reset();</script>"; 
      header("location: contect.php"); 
     } else { 
      die('Could not send mail! Please check your PHP mail configuration.'); 
     } 
    } 
} 

答えて

1

$sender_lname = filter_var($_POST["fname"], FILTER_SANITIZE_STRING);であるべき、$sender_lname = filter_var($_POST["lname"], FILTER_SANITIZE_STRING);

あなたがブラウザを更新している場合は、彼らは最後のPOSTリクエストをキャッシュする傾向があります。フォームデータを再提出するかどうか尋ねられる場合があります。トークンのハッシュ値を含む隠しフィールドを追加してみてください。

<input type="hidden" name="token" value="someHashValue">

$_SESSIONに格納されている1つに対して提出されたトークンを比較するために、セッションを実装します。

session_start(); 
session_regenerate_id(); //Used properly, helps deter session fixation; 
$_SESSION['token'] = "someHashValue"; //Must be unique for each page load. 

トークンを作成するには、適切なハッシュ関数を使用します。私はmd5sha1の明確な指導をします。

基本的には...

if($_SESSION['token'] === $_POST['token']) 
{ 
    //Good. You want to filter, validate, and check this early on. 
    //Whatever you do, just be consistent. 
} 

はまた、あなたのコードでは、ブラウザによって提供されるファイル名($file_name = $_FILES['file_upload']['name'];)を使用しての警戒します。ほとんどの人はそれを使用しない方法を見つけると言いますが、そうする場合は、何らかの方法でフィルタリングして検証する必要があります。ファイルの名前を変更するのが適切かもしれません。ファイルサイズを確認することも良い考えです。ファイルサイズビットのphp.iniにあまり依存しないでください。ファイルタイプが重要な場合は、ファイルを受け入れる前にファイルを検査することさえできます。

最後に、PHPフィルタ関数を使用する場合は、filter_input_array()INPUT_POSTをPOSTデータとして使用することをお勧めします。 $_FILESスーパーグローバルでは、私はそれを検証するために別のルーチンを作ったが、それにはfilter_input_array()を使うことはできない。がんばろう!あなたはあなたの方法です!

-1

あなたがWebプログラミングの優れた実践の一部に従わなかったので、それはフォームごとに送信します。

は、ここに私のコード形式のフォームです。

まず、送信されたフォームからデータを受信した後、ユーザーを新しいページにリダイレクトして、リクエストタイプをGETに変更し、次の送信を防ぐ必要があります。

次に、ダブル提出とCSRFattacksの2つの状況を防ぐために、CSRF tokenを使用する必要があります。

関連する問題