Как защитить контактную форму без капчи? - PullRequest
5 голосов
/ 01 марта 2012

На моем сайте есть пара форм, где кто-то (без регистрации) может отправить сообщение указанному зарегистрированному пользователю. Форма проста, и я хочу сохранить это. Как лучше защитить контактную форму от спама и ботов, если я не хочу использовать капчу?

Your message:...
Your e-mail:...
[Send]

Ответы [ 5 ]

7 голосов
/ 07 апреля 2013

По моему мнению, многие сайты (за исключением продавцов билетов, крупных сайтов, таких как Google, и других сайтов, на которые будет выполняться таргетинг) могут предотвращать спам в комментариях / формах без капчи, используя несколько различных методов в комбинации. Недавно я создал проект PHP с открытым исходным кодом, который реализует следующие тесты, чтобы определить, является ли отправка вероятной, или спам.

  • Скрытое поле формы - если заполнено скрытое поле формы, это показатель спама
  • Время отправки формы - если форма заполняется слишком быстро или слишком медленно, это показатель спама
  • Слишком много URL-адресов - если в поле комментария слишком много URL-адресов (число настраивается), это показатель спама
  • Движение мыши - если пользователь не использует свою мышь, это показатель спама
  • Используемая клавиатура - если пользователь не использует свою клавиатуру, это показатель спама
  • Validate Referer - если HTTP-реферер не соответствует URL-адресу формы, мы не должны принимать отправку.
  • Проверка электронной почты. Если адрес электронной почты, указанный в форме, недействителен с точки зрения синтаксиса, мы не должны принимать отправку.

Вот URL проекта. Мне нравится тест Kaii выше, я бы сделал отличный дополнительный тест для phpFormProtect. https://github.com/mccarthy/phpFormProtect

7 голосов
/ 01 марта 2012

Итак, варианты:

  1. Развернуть запрос / IP
  2. Добавить секретный вопрос
  3. Капча (даже если вам это не нравится)
  4. Отправка электронной почты для подтверждения
  5. Отправка данных через JavaScript

Подробности об этом и мое мнение о них.

  1. Хорошо работает, чтобы предотвратить отправку многих сообщений, но несколько их копий все равно попадут. Если вы считаете, что это доступно, это может сработать. Примечание: спамер может использовать прокси или динамический IP, но это может быть медленным. Возможно, стоит подумать не о блокировке пользователя, а о добавлении капчи, если они отправляют слишком много писем.
  2. Что это такое? Это такие вопросы, как «10 + 1» или «десять плюс 1» или «Какой сегодня день?». Они могут хорошо работать - если ваш сайт будет только на нескольких языках. Капчи еще лучше, но на всякий случай это хорошо работает.
  3. Тебе это не нравится, но я все еще говорю, что это лучшее. Добавление одного reCAPTCHA не так сложно, но это предотвратит 90% спамеров или даже больше. Но есть две проблемы с этим: 1. иногда человек не может прочитать его, 2. спамеры могут использовать людей, чтобы решить его за минимальную (например, 0,001 доллара США), а иногда и делают. Но это также относится и к случаю 2.
  4. Может быть хорошо, но если спамеры заметят это, они могут генерировать случайные адреса электронной почты и проверять их через SMTP. Но они обычно идут к самой легкой цели и уходят.
  5. Хорошо, спаммеры не могут заставить ботов вести себя как клик, но они могут создавать коды, которые делают клик ненужным. Но самое простое целевое правило остается.

На мой взгляд, лучшее решение 3, затем решение 2, затем решение 1, затем решение 4 и 5.

6 голосов
/ 01 марта 2012

Вы можете защитить свою форму с помощью ключей формы техника:

  1. При отображении формы пользователю, генерируйте случайный идентификатор («ключ формы») только для этой единственной отправки формы. Сохраните ключ формы в переменной сеанса. Отправьте «ключ формы» в скрытом поле ввода.
  2. На стороне отправки проверьте отправленный ключ формы по сравнению с ключом, сохраненным в переменной сеанса. Немедленно аннулируйте это после использования. (удалить его из сеанса)

Без капчи или чего-либо подобного невозможно действительно защитить форму от злоупотребления.

Однако, используя эту технику, злонамеренный спамер должен будет

  1. запрос формы через HTTP для каждой отдельной отправки формы для получения действительного уникального ключа
  2. анализ дерева DOM / HTML-кода для получения ключа формы
  3. отправить в правильном формате

Насколько мне известно, ни один автоматический поисковик контактной формы не делает этого.

Этот метод также защищает вашу форму от нескольких случайных представлений.

Вот пример кода:

<?php
session_start();
if (isset($_POST['form_submit'])) {
  // do stuff
  if (isset($_POST['formkey']) && isset($_SESSION['formkeys'][$_POST['formkey']])) {
    echo "valid, doing stuff now ... "; flush();
    // delete formkey from session
    unset($_SESSION['formkeys'][$_POST['formkey']]);
    // release session early - after committing the session data is read-only
    session_write_close();
    // do whatever you like with the form data here
    send_contact_mail($_POST);
  }
  else {
    echo "request invalid or timed out.";
  }
}
else {
  // show form with formkey
  $formkey = md5("foo".microtime().rand(1,999999));
  // put current formkey into list of valid form keys for the user session
  if (!is_array($_SESSION['formkeys']) {
    $_SESSION['formkeys'] = array();
  ]
  $_SESSION['formkeys'][$formkey] = now();
?>
<html>
<head><title>form key</title></head>
<body>
  <form method="POST">
    <input type="hidden" name="PHPSESSID" value="<?=session_id()?>">
    <input type="text" name="formkey" 
      value="<?= $formkey ?>">
    <input type="submit" name="form_submit" value="Contact us!">
  </form>
</body>
</html>
<?php } ?>
1 голос
/ 01 марта 2012

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

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

Это также то, что Реализация StackOverflow 2 года назад.

0 голосов
/ 01 марта 2012

Вы можете сделать что-то, чтобы доказать, что пользователь - человек. Если вы хотите сохранить простоту, то, возможно, поле с математическим вопросом, например «2 + 5?». Но это не так безопасно, как может быть капча. Но если возможный спам не мешает вам, это нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...