2017-02-19 7 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.

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

Используйте хорошую функцию хеширования для создания токена. Я бы избежал md5 и sha1.

В основном ...

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

Он посылает форму каждый раз, потому что вы не следовали некоторые хорошие практики веб-программирования.

Прежде всего, после получения данных из представленной формы, вы должны перенаправить пользователя на новую страницу, чтобы изменить тип запроса на GET и предотвратить следующее отправление.

Следующее, что вы должны использовать CSRF token, чтобы предотвратить две ситуации: двойная подача и .

Смежные вопросы