2016-02-24 6 views
2

Я собрал простую форму электронной почты PHP для веб-сайта, но он так часто посылает пустые электронные письма. Большинство полей являются «обязательными», и я некоторое время использовал систему «captcha», но продолжались пустые письма.PHP электронная почта, пустая электронная почта

HTML разметка:

<form action="mail_send.php" method="post"> 

<input name="name" type="text" required="required" size="40" /> 

<input name="email" type="text" required="required" size="40" /> 

<input name="company" type="text" size="40" /> 

<textarea name="message" cols="80" rows="7" required="required"></textarea> 

<input type="submit" value="Submit" /> 

</form> 

PHP:

$name = $_POST['name']; 
$email = $_POST['email']; 
$company = $_POST['company']; 
$message = $_POST['message']; 
$formcontent=" FROM:\n $name \n\n COMPANY:\n $company \n\n MESSAGE:\n $message"; 
$recipient = "email address"; 
$subject = "Subject"; 
$mailheader = "From: $email \r\n"; 
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!"); 

echo "<script>window.location = 'confirmation.php'</script>"; 

Все отлично работает, когда я проверить это, я получаю письма от формы без каких-либо проблем на всех, но по какой-то причине я продолжаю часто получая пустые письма (возможно, от роботов).

Любые идеи?

Спасибо!

+0

Относится ли страница PHP к HTML-странице? Если это так, бот может просто отправить на этот URL-адрес, не пройдя через вашу форму. Я бы предложил также выполнить проверку сервера. –

+0

@ user2547075 PHP действительно отдельный. – JackPirate

+0

Я бы предложил поставить дубликат сервера проверки. Никогда не доверяйте клиенту! :) –

ответ

3

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

Вы можете стать жертвой ботов, или какой-нибудь шутник, посещающий ваш сайт, когда-либо так часто, чтобы вас пометить.

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

  • Проверьте журналы доступа.

Итак, используйте условные !empty() против всех ваших входов.

т.е .:

Sidenote: || проверяет, если один или любой пустуют.

if(!empty($_POST['name']) || !empty($_POST['email'])){ 

    $name = $_POST['name']; 
    $email = $_POST['email']; 

    // process mail 

} 

Вы можете добавить другие модели.

или дайте свой отправить атрибут имя:

<input name="submit" type="submit" value="Submit" /> 

Затем проверьте, если кнопка установлена ​​и что входы не являются пустыми:

if(isset(_POST['submit'])){ 

    if(!empty($_POST['name']) || !empty($_POST['email'])){ 

     $name = $_POST['name']; 
     $email = $_POST['email']; 

     // process mail 

    } 

} 

Вы должны также использовать фильтры, для ввода электронной почты:

Плюс, если вы решите использовать радио/Флажки позже, используйте isset() против них.

Sidenote:

Вы можете добавить флажок в форму, чтобы проверить, если он был установлен или нет, и обработать его с условным оператором.


Сноска:

«Большинство полех является„требуется“, и я использовал систему искаженной на некоторое время, но пустые письма приходили.»

В вашем вопросе нет никакого кода для отслеживания.

N.B .:

Обязательный атрибут работает только в HTML5 поддерживается браузерами. Поэтому, если любой из этих ботов или посетителей вашего сайта использует браузер, который не поддерживает HTML5, или технологию, которая может обойти его, то это тоже может быть другим (способствующим) фактором.

+0

Как указано в одном из ответов на комментарии, обязательный атрибут, отображаемый в HTML-коде OP, является действительным XHTML. (пока он определен в doctype). Просмотр элементов ввода в его форме только затвердевает этот аргумент, как и в любом другом типе html, его следует закрыть с помощью '' over '/>' – Xorifelse

+0

@Xorifelse OP должен размещать полный код затем и показать нам, как выглядит их декларация о документе. На данный момент OP все еще нигде не комментирует, так что это чья-то игра. –

+0

@ Fred-ii- Спасибо за ответ. Я буду выполнять ваши предложения. Чистые письма поступают почти ежедневно, если он останавливается на день или два, он, вероятно, работал. – JackPirate

0
<textarea name="message" cols="80" rows="7" required="required"></textarea> 

должен быть

<textarea name="message" cols="80" rows="7" required></textarea> 

Вы пишете XHTML или HTML?

Валидация на стороне сервера также рекомендуется. См. Ответы ниже о том, как это сделать.

+0

Это относится к ошибке HTML, php не заботится об этом. И даже так, это справедливо в xhtml 1.1. – Xorifelse

+0

Он заявил HTML. Я бы предположил его html 5. –

+0

Я бы предположил html 4.01, так как я не вижу ссылки на какую-либо разметку html 5. – Xorifelse

0

Но по какой-то причине вы получаете пустые сообщения электронной почты, возможно, от роботов

довольно много ответил на ваш вопрос. Роботы могут быть довольно продвинутыми и ломать определенный Captcha'a, а также отправлять сообщения о пустой почте. Вы должны проверить, не являются ли почтовые запросы пустыми.

Нерушимый captcha - это те, что вы написали сами (и не распространяйте свою собаку до тех пор, пока она не станет популярной) или the recently introduced one from Google. попробуйте (после того, как вы проверили значения empty)

+0

Я попробовал recaptcha из Google, но это не помешало отправке пустых писем. Я попробую ваше предложение проверить пустые значения. – JackPirate

2

Вам нужно будет выполнить проверку на вашем PHP.

http://www.w3schools.com/php/php_form_validation.asp

В основном вы хотите сделать следующее:

безопасности

<?php 
// define variables and set to empty values 
$name = $email = $gender = $comment = $website = ""; 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 
    $name = test_input($_POST["name"]); 
    $email = test_input($_POST["email"]); 
    $website = test_input($_POST["website"]); 
    $comment = test_input($_POST["comment"]); 
    $gender = test_input($_POST["gender"]); 
} 

function test_input($data) { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 
?> 

Validation

if (!empty($email)){ 
    //your code to send email 
} 

Вы можете сделать это немного сложнее, если хотите проверить несколько вещей.

$fail_validation = FALSE; 
if (empty($email)){ 
    $fail_validation = TRUE; 

} 
if (empty($phone)){ 
    $fail_validation = TRUE; 

} 
if ($fail_validation == FALSE){ 
    //code to send mail goes here 
} 

Обратите внимание, что это очень простой способ, и вы можете рассмотреть возможность изучения некоторых дополнительных функций для защиты PHP. Я бы также предложил использовать honeypot в качестве дополнительного уровня безопасности. https://stackoverflow.com/a/22103646/2547075

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