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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

Что делать, если бот не обнаруживает никаких 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>. Чем,

  • Создайте form.html и поместите свой form внутри элемента <div id="formContainer">.
  • Внутри страницы, где вам нужно позвонить в эту форму, используйте пустой <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 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>

Ответ 4

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

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

Надеемся на эту помощь

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

http://recaptcha.net/

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

Ответ 8

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

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

<script>
function checkForm()
{
    // When a user submits the form, the secretField 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 скрипт -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

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

Где-то в вашем php script...

<?php

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

?>

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

Ответ 9

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

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


Плюсы:

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

Минусы:

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


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

Ответ 10

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

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

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

Ответ 11

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

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

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

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

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

Ответ 12

Я думаю о многом:

  • используя JS (хотя вы этого не хотите), чтобы отслеживать движение мыши, нажатие клавиши, щелчок мышью
  • получение реферального URL-адреса (который в этом случае должен быть одним из одного домена)... нормальный пользователь должен перейти через веб-сайт до получения контактной формы: PHP: How получить URL-адрес реферера?
  • с использованием переменной $_SESSION для получения IP-адреса и проверки отправки формы на этот список IP-адресов
  • Заполните одно текстовое поле с помощью некоторого фиктивного текста, который вы можете проверить на стороне сервера, если он был перезаписан.
  • Проверьте версию браузера: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html... Ясно, что бот не будет использовать браузер, а просто script.
  • Используйте AJAX для отправки полей один за другим и проверьте разницу во времени между представлениями
  • Используйте фальшивую страницу до/после формы, просто для отправки другого ввода

Ответ 13

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

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

Если это было true, это уже не так.

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

 <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" />

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

Ответ 14

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

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

Ответ 15

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

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

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

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

ИЗМЕНИТЬ

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

Ответ 16

Здесь есть tutorial об этом на сайте JQuery. Хотя идея JQuery является независимой от структуры.

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

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

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

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

Ответ 20

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

Ответ 21

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

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

То, что я использую, представляет собой комбинацию поддельных полей форм (также называемых недействительными полями в случае использования браузера, который не обрабатывает CSS вообще или display: none в частности), (т.е. является ли формат ввода действительным?), тимпинг времени (как слишком быстрые, так и слишком медленные представления), MySQL (для реализации черных списков на основе адресов электронной почты и IP-адресов, а также фильтров потока), DNSBL (например, SBL + XBL из Spamhaus), текстовый анализ (например, слова, которые являются сильным показателем для спама) и проверки электронной почты (чтобы определить, действительно ли указан адрес электронной почты).

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

Ответ 22

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

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

Ответ 23

Я добавил проверку времени в свои формы. Формы не будут представлены, если они заполнены менее чем за 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

}

Ответ 24

Вы можете попытаться обмануть спам-роботов, добавив правильный атрибут действия после проверки 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(), чтобы предотвратить ошибки

Ответ 25

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

Ответ 26

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

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

Ответ 27

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

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