Как предотвратить автоматическое заполнение формы роботами?

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

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

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

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

27 ответов


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

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

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

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


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

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

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

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


что делать, если - бот не находит каких-либо 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"> после (!) the "бот-приманка" input для фактической электронной почты пользователя адрес.)

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

разработчика.Мозилла - выключив форма autocompletition
StackOverflow-Игнорировать Tabindex


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

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

надеюсь, что это поможет


очень эффективный способ практически устранить спам - это иметь текстовое поле, в котором есть текст, например " удалить этот текст, чтобы отправить форму!"и этот текст должен быть удален, чтобы представить форму.

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

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


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


http://recaptcha.net/

reCAPTCHA-бесплатный сервис antibot, который помогает оцифровывать книги

Он был приобретен Google (в 2009 году):

также см.


многие из этих спам-ботов - это просто серверные скрипты, которые рыщут в интернете. Вы можете бороться со многими из них, используя 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.');
}

?>

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


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

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


плюсы:

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

плюсы:

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


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


С появлением безголовых браузеров (например, 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" />

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


очень простой способ-предоставить некоторые поля, такие как <textarea style="display:none;" name="input"></textarea> и отбросьте все ответы, в которых это заполнено.

другой подход-сгенерировать всю форму (или только имена полей) с помощью Javascript; немногие боты могут ее запустить.

в любом случае, вы не будете делать много против живых "ботов" из Тайваня или Индии, которые платят $0.03 за одну размещенную ссылку и зарабатывают на жизнь таким образом.


У меня есть простой подход к остановке спамеров, который на 100% эффективен, по крайней мере, по моему опыту, и избегает использования reCAPTCHA и подобных подходов. Я перешел от почти 100 спам в день на одном из html-форм моих сайтов к нулю за последние 5 лет, как только я реализовал этот подход.

Он работает, используя возможности псевдонима электронной почты большинства сценариев обработки html-форм (я использую FormMail.pl), вместе с графическим представлением "код", который легко создается в самая простая из графических программ. Один такой график включает M19P17nH код и подсказка "введите код слева".

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

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

конечно, человек может решить эту проблему в мгновение ока, без всех проблем, связанных с reCAPTCHA и подобных, более элегантных, схем. Если человек-спамер реагирует на сбой получателя и программирует код изображения в робота, вы можете легко изменить его, как только поймете, что робот имеет был жестко запрограммирован на ответ. За пять лет использования этого подхода у меня никогда не было спама ни от одной из форм, на которых я его использую, ни от одного пользователя форм. Я уверен, что это может быть избито с возможностью OCR в роботе, но у меня никогда не было этого на любом из моих сайтов, которые используют html-формы. Я также использовал "спам-ловушки" (скрытый html-код "come hither", который указывает на мою политику защиты от спама), но они были только около 90% эффективно.


Я думаю о многих вещах здесь:

  1. использование JS (хотя вы этого не хотите) для отслеживания перемещения мыши, нажмите клавишу, щелкните мышью
  2. получение реферального url (который в этом случае должен быть одним из того же домена)... обычный пользователь должен перемещаться по веб-сайту, прежде чем добраться до контактной формы: PHP: как получить URL-адрес реферера?
  3. использование переменной $_SESSION для получения IP-адреса и проверки формы отправки по этому списку IPs
  4. заполните одно текстовое поле фиктивным текстом, который вы можете проверить на стороне сервера, если он был перезаписан
  5. проверьте версию браузера:http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Понятно, что бот будет использовать не браузер, а просто скрипт.
  6. используйте AJAX для отправки полей по одному и проверьте разницу во времени между представлениями
  7. используйте поддельную страницу До / После формы, просто отправить другой ввод

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

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


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

попробуйте добавить такое поле:

  • скопируйте "hello" в поле в сторону
  • 1+1 = ?
  • скопируйте имя веб-сайта в поле

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

редактировать

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


есть учебник об этом на сайте JQuery. Хотя это JQuery, идея независима от фреймворка.

Если JavaScript недоступен, вам может потребоваться вернуться к подходу типа CAPTCHA.


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


Это просто идея, id использовал это в моем приложении и работает хорошо

вы можете создать cookie при движении мыши с помощью javascript или jquery и на стороне сервера проверить, существует ли cookie, потому что только у людей есть мышь, cookie может быть создан только ими cookie может быть меткой времени или токеном, который может быть validate


использовать 1) форма с токенами 2) Проверьте форму, чтобы сформировать задержку с IP-адресом 3) IP блока (опционный)


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

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

Я не думаю, что это хорошо, Действительно, я хочу получить электронные письма от пользователей, которые выполняют определенные действия, потому что это пользователи, которые меня интересуют (например, пользователи, которые посмотрели страницу "CV" и использовали правильную контактную форму). Поэтому, если пользователь делает что-то, что я хочу, я начинаю отслеживать его сеанс и устанавливаю cookie (я всегда устанавливаю cookie сеанса, но когда я не начинаю сеанс, это просто поддельный cookie, чтобы поверить, что у пользователя есть сеанс). Если пользователь делает что-то нежелательное, я не беспокоюсь о сохранении сеанса для его так нет перегрузки etc.

также было бы неплохо, чтобы рекламные услуги предлагали какой-то api(возможно, он уже существует), чтобы увидеть, если пользователь "посмотрел на объявление", вполне вероятно, что пользователи, смотрящие на рекламу, являются реальными пользователями, но если они не очень хорошо, по крайней мере, вы получите 1 просмотр в любом случае, так что ничего не потеряете. (и поверьте мне, элементы управления ads более сложные, чем все, что вы можете сделать в одиночку)


на самом деле ловушка с дисплей: нет работает как шарм. Это помогает переместить объявление CSS в файл, содержащий любые глобальные таблицы стилей, которые заставили бы спам-ботов загружать их (прямой style= " display: none;" объявление, вероятно, может быть интерпретировано спам-ботом, как и объявление локального стиля в самом документе).

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

то, что я использую, - это комбинация поддельных полей формы (также описывается как недопустимые поля, если используется браузер, который не обрабатывает CSS вообще или дисплей: нет в частности), проверки здравомыслия (i. e. допустим ли формат ввода?), время штамповки (слишком быстро и слишком медленно представлений), MySQL (для реализации черных списков на основе e-mail и IP-адресов, а также фильтров потока), черными списками посредством DNSBL (электронная. г. на СБЛ+XBL из он), анализ текста (Эл. г. слова, которые являются сильным признаком для спама) и проверка электронной почты (чтобы определить, является ли адрес электронной почты, указанный адрес является действительным).

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


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

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


Я добавил проверку времени в свои формы. Формы не будут представлены, если заполнены менее чем за 3 секунды, и это отлично работает для меня, особенно для длинных форм. Вот функция проверки формы, которую я вызываю на кнопке отправки

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}

вы можете попробовать обмануть спам-роботов, добавив правильное действие atribute после проверки Javascript. поэтому, если робот блокирует javascript, они никогда не отправляют правильно форму.

HTML-код

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

в JavaScript

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

Я добавляю "обратный вызов" после .attr () для предотвращения ошибок


со все более сложными спам-ботами и методами, такими как автоматические браузеры, будет сложнее определить источник спама. Но независимо от того, размещено ли программное обеспечение, человек или оба, спам является спамом из-за его содержания. Я думаю, что лучшее решение-запустить размещенный контент через API антиспама, такой как Cleantalk или Akismet. Это относительно дешево и эффективно и не беспокоит пользователя. Вы можете проверить время подачи формы и другие традиционные проверки для менее сложных боты перед попаданием в API.


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

в противном случае, я думаю, вы будете вынуждены использовать форму доказательства клиента "человечности"


только мои пять центов стоит. Если цель этого-остановить 99% роботов, что звучит довольно хорошо, и если 99% роботов не могут запустить Java-скрипт, лучшее решение, которое бьет все, - это просто не использовать форму, которая имеет действие отправки с URL-адресом post.

Если форма управляется через java-скрипт и java-скрипт собирает данные формы, а затем отправляет их через HTTP-запрос, ни один робот не может отправить форму. Поскольку кнопка submit будет использовать Java-script для запуска кода, который отправляет форму.