Как запретить роботам автоматически заполнять форму? - PullRequest
99 голосов
/ 05 марта 2010

Я пытаюсь найти достаточно хороший механизм защиты от спама, чтобы предотвратить автоматически сгенерированный ввод. Я читал, что методы, такие как капча, 1 + 1 =? все работает хорошо, но они также представляют собой дополнительный шаг, препятствующий бесплатному быстрому использованию приложения (я не ищу ничего подобного, пожалуйста).

Я пытался установить некоторые скрытые поля во всех моих формах, с display: none; Тем не менее, я уверен, что скрипт можно настроить так, чтобы он отслеживал идентификатор поля формы и просто не заполнял его.

Реализуете ли вы / знаете ли вы хороший анти-автоматический метод заполнения форм-роботов? Есть ли что-то, что может быть легко реализовано с помощью обработки на сервере HTML И / ИЛИ и быть (почти) пуленепробиваемым? (без JS, так как его можно просто отключить).

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

Ответы [ 27 ]

71 голосов
/ 05 марта 2010

Простой в реализации, но не защищенный от ошибок (особенно при «определенных» атаках) способ устранения спама - отслеживание времени между отправкой формы и загрузкой страницы.

Боты запрашивают страницу, анализируют страницу и отправляют форму. Это быстро.

Люди вводят URL, загружают страницу, ждут, пока страница полностью не загрузится, прокручивают страницу вниз, читают содержимое, решают, комментировать / заполнять форму, требуется время для заполнения формы и отправки.

Разница во времени может быть незначительной; и для того, чтобы отслеживать это время без файлов cookie, требуется какой-либо способ создания базы данных на стороне сервера. Это может повлиять на производительность.
Также вам нужно настроить пороговое время.

71 голосов
/ 05 марта 2010

Я действительно считаю, что простое поле Honey Pot работает хорошо. Большинство ботов заполняют каждое поле формы, которое они видят, в надежде обойти обязательные валидаторы поля.

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

Если вы создаете текстовое поле, скрываете его в javascript, а затем проверяете, что на сервере установлено значение blank , это отсеивает 99% роботов и не вызывает 99% Ваши пользователи любое разочарование на всех. Оставшиеся 1%, у которых отключен JavaScript, будут по-прежнему видеть текстовое поле, но вы можете добавить сообщение типа «Оставьте это поле пустым» для таких случаев (если вы заботитесь о них вообще).

(Кроме того, отметив, что если вы делаете style = "display: none" на поле, то для робота слишком просто просто увидеть это и отбросить поле, поэтому я предпочитаю подход javascript ).

20 голосов
/ 06 января 2016

Что если - бот не найдет form вообще?

3 примера:

1. Вставьте вашу форму, используя AJAX

если вы в порядке с пользователями, у которых отключен JS и вы не можете видеть / отправить форму ... Вы всегда можете уведомить их, используя <noscript><p class="error">ERROR: The form could not be loaded. Please, re-enable JavaScript in your browser to fully enjoy our services.</p></noscript>. Чем,

  1. Создайте form.html и поместите form в элемент <div id="formContainer">.
  2. Чем внутри страницы, где вам нужно вызвать эту форму, используйте пустой <div id="dynamicForm"></div> и этот jQuery:

$("#dynamicForm").load("form.html #formContainer");

2. Создайте свою форму полностью используя JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

3. Бот-приманка вход

боты типа ( действительно как) дерзкий элементы ввода, такие как:

<input
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1" />

они будут рады ввести какое-то значение, как они делают dsaZusil@kddGDHsj.com

чем (после использования вышеупомянутого HTML), с помощью CSS сделать так:

input[name=email]{ /* bait input */
    /*
         don't use display:none or visibility:hidden
         cause that will not fool the bot
    */
    position:absolute;
    left:-2000px;
}

теперь, когда ваш ввод невидим для пользователя, ожидайте в PHP, что ваш $_POST["email"] должен быть пустым (без какого-либо значения)! В противном случае не отправляйте форму.

Теперь все, что вам нужно сделать, это создать другой вход , как <input name="sender" type="text" placeholder="Your email"> после (!) "bot-bait" для фактического Адрес электронной почты пользователя.)

Благодарности:

Developer.Mozilla - Отключение автозаполнения формы
StackOverflow - игнорировать Tabindex

17 голосов
/ 10 марта 2012

Я использовал скрытое поле и поместил на него метку времени, а затем сравнил его с меткой времени на сервере с использованием PHP.

Если оно было быстрее 15 секунд (зависит от того,маленькие твои формы) это был бот.

Надеюсь эта помощь

15 голосов
/ 19 сентября 2012

Очень эффективный способ практически полностью устранить спам - это иметь текстовое поле с текстом, например «Удалить этот текст, чтобы отправить форму!» и этот текст должен быть удален для отправки формы.

При проверке формы, если текстовое поле содержит исходный текст или произвольный текст по этому вопросу, не отправляйте форму. Боты могут читать имена форм и автоматически заполнять поля «Имя» и «Электронная почта», но не знают, нужно ли им на самом деле удалять текст из определенного поля для отправки.

Я внедрил этот метод на нашем корпоративном сайте, и он полностью исключил спам, который мы получали ежедневно. Это действительно работает!

11 голосов
/ 16 марта 2012

Как насчет создания поля ввода текстового поля того же цвета, что и фон, который должен оставаться пустым. Это позволит обойти проблему с отображением чтения бота: нет

8 голосов
/ 05 марта 2010

http://recaptcha.net/

reCAPTCHA - это бесплатная антибот-служба, которая помогает оцифровывать книги

Это было получено Google (в 2009):

Также см.

6 голосов
/ 05 марта 2010

Многие из этих спам-ботов являются просто серверными сценариями, которые бродят по сети. Вы можете бороться со многими из них, используя некоторый JavaScript, чтобы манипулировать запросом формы перед его отправкой (т. Е. Устанавливая дополнительное поле на основе некоторой клиентской переменной). Это не полное решение и может привести ко многим проблемам (например, пользователям без javascript, на мобильных устройствах и т. Д.), Но оно может быть частью вашего плана атаки.

Вот тривиальный пример ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

Где-то в вашем PHP-скрипте ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

Кроме того, капчи великолепны и действительно лучшая защита от спама.

4 голосов
/ 16 февраля 2015

Я удивлен, что никто еще не упомянул этот метод:

  • Добавьте на свою страницу маленькое скрытое изображение.
  • Поместите куки при показе этого изображения.
  • При обработке отправки формы проверьте наличие cookie.


Плюсы:

  • удобно для пользователя и разработчика
  • кажется надежным
  • без JavaScript

Минусы:

  • добавляет один HTTP-запрос
  • требует, чтобы куки были включены на клиенте


Например, этот метод используется плагином WordPress Cookies для комментариев .

3 голосов
/ 06 апреля 2016

С появлением безголовых браузеров (таких как phantomjs), которые могут эмулировать что угодно, вы не можете предположить, что:

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

Если это было правдой, то это уже не правда.

Если вы не хотите удобного для пользователя решения, просто дайте им красивое "Я - спамер" Кнопка отправки :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

Конечно, вы можете играть с двумя кнопками input[type=image] для изображений, изменяя порядок после каждой загрузки, варианты текста, содержимое изображений (и их размер) или name кнопок; что потребует некоторой работы сервера.

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

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

...