Отсеивание спамеров / ботов через php

0

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

Я не могу заставить его работать правильно.

Тестовый сайт - http://www.webexplosive.com/s1/contact.html

Вот мой php-скрипт для контактной формы:

<?php
    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email1 = $_POST ['email1'];
    $phone = $_POST ['phone'];
    $comments = $_POST ['comments'];
    $testBot = $_POST ['email2'];

    $headers = "MIME-Version: 1.0\r\n";
    $headers = "From: $email1";
    $to = '[email protected]';
    $subject = 'Contact Form Submitted - Virginia Subsite';
    $message = "
    First name: $firstname \n
    Last name: $lastname \n
    Email: $email1 \n
    Phone: $phone \n
    Comments: $comments \n";

    mail($to, $subject, $message, $headers);

    header("Location: thankyou.html");

    if(email2 == "") { //If email2 form section is blank then... 
        $firstname = $_POST['firstname'];
        $lastname = $_POST['lastname'];
        $email1 = $_POST ['email1'];
        $phone = $_POST ['phone'];
        $comments = $_POST ['comments'];
        $testBot = $_POST ['email2'];

        $headers = "MIME-Version: 1.0\r\n";
        $headers = "From: $email1";
        $to = '[email protected]';
        $subject = 'Contact Form Submitted - Virginia Subsite';
        $message = "
        First name: $firstname \n
        Last name: $lastname \n
        Email: $email1 \n
        Phone: $phone \n
        Comments: $comments \n";

        mail($to, $subject, $message, $headers);

        header("Location: thankyou.html");
    }
    else {
        header("Location: thankyou.html");

    }
?>
  • 3
    «Не могу заставить его работать» не совсем полезно для диагностики проблемы ... Не будет работать КАК? Сбои? Синтаксические ошибки? Электронная почта террористических угроз различным национальным лидерам? Кстати, if (email ==...) не совсем правильно ... возможно, пропустили $ ?
  • 0
    Он отправляет мне электронное письмо, когда заполнено поле testbot. Не предполагается.
Показать ещё 5 комментариев
Теги:
email
spam-prevention
contact-form

5 ответов

0
Лучший ответ

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

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

Предложение: Посмотрите на реализацию капчей или что-то подобное.

  • 1
    как это, это не будет делать приседания. пропущена точка с запятой;)
1

Методика кода

Лучший способ, я видел, чтобы прокормить ботов и спамеров в условиях конкуренции и публичных форм, без капчей. Является ли генерация случайного hash md5 (каждое обновление, должно сделать предыдущий hash бесполезным), хранить hash в cookie (для получения POST). Затем добавьте hash строки к каждому input[name=username_d109770c2788b022deb0fac1182c9e19] (я также POST хэш на форме, и проверки POST против cookie).

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

Как только вы это сделаете, просто добавьте проверку input например, регулярные выражения email и так далее.

Техника безопасности

Установите honeypot project на свой сервер, у него есть 101,130,389 спам-серверов, идентифицированных по состоянию на 20:48, 19/02/2014 (UTC + 12: 00).

Project Honey Pot - это веб-сеть honeypot, которая использует программное обеспечение, встроенное в веб-сайты, для сбора информации об IP-адресах, используемых при сборе адресов электронной почты для спама

  • 0
    +1 даже это не то, что спросил ОП ..
0

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

<?php

// Note: It is your own responsibility to validate user input!

if(isset($_POST['email2']) && $_POST['email2'] != "") {
    $strFirstName = $_REQUEST['firstname'];
    $strLastName = $_REQUEST['lastname'];
    $strEmail = $_REQUEST['email1'];
    $strPhone = $_REQUEST['phone'];
    $strComments = $_REQUEST['comments'];
    $strTestBot = $_REQUEST['email2'];

    $strBody = "First name: ".$strFirstName." \nLast name: ".$strLastName." \nEmail: ".$strEmail." \nPhone: ".$strComments." \n";
    mail('[email protected]', 'Contact Form Submitted - Virginia Subsite', $strBody, 'From: '.$strEmail);

    header("Location: thankyou.html");
} else {
    header("Location: thankyou.html");
}

?>

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

0

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

Примечание. Я не тестировал этот код, и он может терпеть неудачу - не стесняйтесь, если это произойдет

// Form validation, display errors
// in case of empty fields

$fields = ["firstname", "lastname", "email1", "phone", "comments"]

foreach ($fields as $field) {
    if (!isset($_POST[$field]) || empty($_POST[$field])) {
        die("Error, ".$field." can't be empty, please retry."); // if validation fails we stop the script
    }
}

if (isset($_POST["email2"]) && !empty($_POST["email2"])) {
    die(); // hidden field isn't empty, so it spam, so we stop there
}

// e-mail header injection protection
$email1 = filter_var($_POST["email1"], FILTER_SANITIZE_EMAIL);


$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$phone = $_POST ['phone'];
$comments = $_POST ['comments'];

$headers = "MIME-Version: 1.0\r\n";
$headers = "From: $email1";
$to = '[email protected]';
$subject = 'Contact Form Submitted - Virginia Subsite';
$message = "
First name: $firstname \n
Last name: $lastname \n
Email: $email1 \n
Phone: $phone \n
Comments: $comments \n";

mail($to, $subject, $message, $headers);

header("Location: thankyou.html");
0

(Поздний ответ, но может оказаться полезным по дороге).

Как правило, СПАМБОТЫ будут искать элемент формы, называемый email или contact или любой видимый ввод, который они могут положить своими маленькими спам-руками.

Что вы можете сделать, так это показать/пометить ввод, в котором указано: "Если вы человек, НЕ заполняйте это".

Например:

Если вы человек, НЕ заполняйте это: <input type="text" name="email">

затем проверьте, not empty поле. Если он не пуст и (скорее всего) заполнен SPAMBOT, тогда сделайте его die(); или перенаправить.

Например: и используя if(isset... из именованной кнопки отправки:

<input type="submit" name="soobmeet" value="Send">

Sidenote: Я выбрал "soobmeet", потому что вообще не рекомендуется называть его "submit" и т.д.

(Что-то, что я недавно узнал из одного БОЛЬШОГО ОРУЖИЯ здесь, на SO)

PHP

<?php
if(isset($_POST['soobmeet'])){

    $firstname = $_POST['firstname'];
    $lastname = $_POST['lastname'];
    $email1 = $_POST ['email1'];
    $phone = $_POST ['phone'];
    $comments = $_POST ['comments'];
    $email = $_POST ['email'];

    if(!empty($_POST['email'])){
        header("Location: get_lost.html");
    // or make it die();
    }

    else{
    $headers = "MIME-Version: 1.0\r\n";
    $headers = "From: $email1";
    $to = '[email protected]';
    $subject = 'Contact Form Submitted - Virginia Subsite';
    $message = "
    First name: $firstname \n
    Last name: $lastname \n
    Email: $email1 \n
    Phone: $phone \n
    Comments: $comments \n";

    mail($to, $subject, $message, $headers);
    header("Location: thankyou.html");
    }
}
?>
  • 0
    Или вы можете сделать это поле скрытым с помощью CSS - обычно спам-боты не анализируют CSS, чтобы обнаружить такие поля «honeypot» и заполнить их в любом случае.
  • 0
    Вы действительно правы, Андре, и, как ни странно, я помню, что думал о том же самом, когда писал свой ответ. Я хотел сделать это, но решил, что ОП хочет исправить свой код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню