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

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

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

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

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


person Gal    schedule 05.03.2010    source источник
comment
Спасибо, что не хотите использовать капчу! ИМО, спам в форме является проблемой для владельцев сайтов, и предотвращение этого - не бремя, которое должен нести пользователь. Существует слишком много альтернативных способов борьбы со спамом на сайте, о чем свидетельствуют приведенные здесь ответы. Методы, требующие взаимодействия с пользователем, должны использоваться только ленивыми или новичками.   -  person Mike    schedule 11.03.2015


Ответы (28)


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

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

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

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

person Pindatjuh    schedule 05.03.2010
comment
Спасибо! это отличная идея, и она близка к тому, что я искал. - person Gal; 05.03.2010
comment
Будьте осторожны, если вы хотите разрешить конечным пользователям использовать автоматические заполнители форм, такие как addons.mozilla .org / en-US / firefox / addon / 1882, что может обеспечить очень быструю отправку. Кроме капчи, любая вещь, которая раздражает конечного пользователя, как правило, нехороша, особенно если она мешает человеку, находящемуся в затруднительном положении, действовать (очень) быстро. - person snowflake; 05.03.2010
comment
Хорошая мысль, но все зависит от контекста. Если форма является формой входа в систему, я полностью с вами согласен. Но зачем отключать вход от ботов? Если контекст представляет собой поле для комментариев, подобное этому в StackOverflow, я точно знаю: если вы используете автозаполнение в поле для комментариев, значит, вы спамер. Обратите внимание, что если вы используете автозаполнение для подписей, вам все равно потребуется время для ввода содержимого. - person Pindatjuh; 05.03.2010
comment
Обратите внимание, что SO делает что-то вроде этого. Отредактируйте комментарий слишком быстро или слишком много раз подряд, и вы увидите сообщение «Вы человек?». страница. - person Jakob Borg; 21.05.2010
comment
Хакеры не всегда запрашивают форму. Иногда тщательно созданного URL-адреса (с использованием GET или POST) будет достаточно для многократной публикации формы без особых усилий. - person crafter; 30.07.2013
comment
@Pindatjuh Я пытаюсь реализовать то же самое, но у меня есть некоторые проблемы. stackoverflow.com/questions/20781673/ - person Kiren S; 26.12.2013
comment
@Pindatjuh Что вы имеете в виду под настройкой порогового времени? - person pablito.aven; 24.06.2015
comment
Реализуйте это с помощью капчи. Если форма была отправлена ​​слишком быстро, укажите капчу, чтобы позволить подлинным пользователям пройти. - person Yashovardhan99; 14.07.2017
comment
Пробовал, но это совсем не очень хорошая идея. Когда пользователь заполняет форму и получает сообщение об ошибке, исправление ошибки может занять несколько секунд (например, исправление адреса электронной почты). При второй попытке отправки форма уже заполнена и через короткое время отправляется повторно. Также есть расширения браузера с автозаполнением, которые снова будут давать ложные срабатывания. - person icefront; 11.02.2019
comment
Это не лучшая идея. Бот мог легко реализовать задержку, или пользователь мог использовать автозаполнители форм. - person Noodles; 23.04.2021

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

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

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

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

person Ben Scheirman    schedule 05.03.2010
comment
Как вы думаете, боты действительно просматривают файл css и понимают, что он display: none; ? Я действительно предпочитаю не использовать решение на основе JS, так как его можно легко отключить. - person Gal; 05.03.2010
comment
Похоже, это старое решение для веб-мастеров, включающее массу неуместных ключевых слов для повышения их рейтинга. Я думаю, что поисковые роботы, такие как Google, могут понять, что он отображается: нет. Почему другие боты не могут этого сделать? - person snowflake; 08.03.2010
comment
Бот должен был бы запускать javascript, в том-то и дело. Гал - для крошечного процента ваших пользователей с отключенным javascript у вас просто есть ярлык с надписью Оставьте это поле пустым. Без вреда. - person Ben Scheirman; 08.03.2010
comment
Я использовал эту технику сейчас на двух сайтах, которые подвергались атаке, и регистрация ботов теперь равна нулю на обоих. Это не поможет против целевых атак, но большинство из них в любом случае просто ищут эксплойты или рассылают спам. - person nirvdrum; 09.09.2011
comment
Небольшой момент здесь: чтобы обойти проблему JS, просто используйте CSS, чтобы расположить ввод приманки над верхом страницы - в этом случае будет нормально отключить js, и чтобы обойти это, бот будет должны уметь анализировать абсолютное позиционирование CSS и принимать здравое решение о том, приманка это или нет. немного более пуленепробиваемый :) - person totallyNotLizards; 26.10.2011
comment
@jammypeach или, проще говоря, display: none - person alexyorke; 16.03.2013
comment
@ alexy13 да, это проще, но, как отмечено в ответе, боту намного проще понять, что вы пытаетесь сделать, просто проверьте одно свойство CSS. Если, однако, вы используете стратегию абсолютного позиционирования, бот должен проанализировать все ваши правила позиционирования и правила большинства родительских элементов, чтобы определить, будет ли ввод видимым или нет, а затем выясните, следует ли действовать в соответствии с этой информацией - а это больше проблем, чем того стоит для большинства (если не всех) ботов. - person totallyNotLizards; 18.03.2013
comment
Я знаю, что это запоздалый комментарий, но сайт, над которым я работаю, использовал метод display: none и теперь получает спам, чтобы бот мог его найти. Я просто в процессе тестирования других способов сделать это, например, отключить ввод с экрана, а не скрывать его. - person Will; 08.05.2013
comment
Как бы глупо это ни звучало, я создал ввод для горшочка с медом и просто сделал его type = hidden. На это попадают все глупые роботы и никакого спама. Мне трудно понять, почему все используют капчу, которая в большинстве случаев вызывает ужасные неудобства для пользователей. Я определенно отдаю свой голос горшочкам с медом. - person spirytus; 26.11.2013
comment
Я использую этот подход несколько месяцев, и он отлично работает. Самая простая реализация антибота, которую я знаю. - person San Bluecat; 10.04.2014
comment
@jammypeach Это css-tricks.com/ place-its-tempting-to-use-display-none-but-dont Для визуального скрытия элементов без отображения: none; - person San Bluecat; 10.04.2014
comment
@SanBluecat да, это та же стратегия, которую я защищал из-за недостатков использования display: none, но есть несколько разных подходов, спасибо за ссылку. - person totallyNotLizards; 14.04.2014
comment
Еще одно предложение здесь - расположить поле под другим абсолютно позиционированным участком экрана, используя z-порядок - таким образом, оно все еще находится в видимых границах, но не отображается для пользователя. Вы также можете использовать предотвращение клавиш табуляции, чтобы пользователь не мог случайно перейти к скрытому элементу управления. Ремень и подтяжки! - person Paul; 12.05.2015

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

3 примера:

  1. Вставьте форму с помощью AJAX
  • Если у вас все в порядке с пользователями, у которых отключен JS и которые не могут просматривать / отправлять форму, вы можете уведомить их и сначала включить Javascript с помощью оператора noscript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please 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");

  1. Создайте свою форму полностью с помощью 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>

  1. Бот-приманка ввод
  • Боты любят (действительно нравятся) дерзкие элементы ввода, например:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`[email protected]`
  • После использования приведенного выше HTML вы также можете использовать CSS, чтобы не отображать ввод:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     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

person Roko C. Buljan    schedule 06.01.2016
comment
Может ли браузер законного пользователя потенциально видеть поле ввода приманки как поле электронной почты и автоматически заполнять его, когда пользователь выбирает автозаполнение остальной части формы? Пользователь не увидит, что поле за пределами экрана было заполнено, и они все равно будут выглядеть как бот. - person wilbbe01; 04.04.2016
comment
Я подозреваю, что autocomplete=nope по умолчанию будет on ;-) MDN: input # attr-autocomplete - person handle; 13.04.2018
comment
@handle это не имеет значения, это ввод приманки для бота. Вы можете написать autocomplete="oh sunny day" по этому поводу. - person Roko C. Buljan; 13.04.2018
comment
@ RokoC.Buljan креативные решения для борьбы с ботами, спасибо за то, что поделился - person avia; 28.10.2020

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

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

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

person adnhack    schedule 10.03.2012
comment
Хорошая идея, однако, я бы установил ограничение от 3 до 5 секунд, чтобы позволить быстрым / опытным пользователям. Я использую тот же подход и устанавливаю ограничение на свои формы до 3 секунд, отфильтровывая 99% ботов. - person Kayla; 05.07.2014
comment
@adnhack Вы имеете в виду что-то вроде: 1) при загрузке страницы с помощью php получить время сервера и создать сеанс. 2) пользователь или бот заполняет форму, нажимает «Отправить» и $.post отправляет все во внешний файл php. 3) во внешнем php снова получить время сервера и сравнить со временем сеанса? - person Andris; 20.02.2015

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

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

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

person HawleyTronics    schedule 19.09.2012
comment
Интересно, знаете ли вы, что он более эффективен, чем другие ответы ... скрытое текстовое поле или отслеживание времени, необходимого для заполнения формы? - person Austin Henley; 24.09.2012
comment
Это также поймает тех пользователей, которые не могут следовать указаниям, что может быть нежелательно. - person wilbbe01; 04.04.2016
comment
Мне это нравится! Пока бот не начнет пробовать разные комбинации пустых и заполненных полей ... лучший способ проверить это реализовать и просканировать с одним из следующих: sectoolmarket.com/ - person nmit026; 08.02.2017
comment
Эффективен, поскольку человек, управляющий ботом, не узнает и не настраивает код. - person Talha Awan; 27.05.2017

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

person Steve    schedule 15.03.2012
comment
Добавьте это как комментарий, когда у вас будет больше репутации, вместо ответа;) - person Rob; 26.10.2012
comment
Это создает проблемы с доступностью. Индекс приманки не будет скрыт от пользователей программ чтения с экрана. - person Otterfan; 07.08.2014
comment
Я слепой пользователь, и однажды я нашел такое поле формы, и надпись над ним гласила: Если вы это видите, оставьте это поле пустым. Очень эффективный ИМО. - person Parham Doustdar; 14.06.2016

http://recaptcha.net/

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

Приобретено компанией Google (в 2009 году):

Также см

person Anantha Kumaran    schedule 05.03.2010
comment
Как пользователю мне часто бывает трудно понять recaptcha. Некоторые слова так трудно читать, что вам придется попробовать 3 или 4 раза. Хотя это определенно поможет с проблемой роботов. - person Brian; 05.03.2010
comment
Что сказал Брайан и: yro.slashdot.org/story/10/03/02/0135238/ - person SF.; 05.03.2010
comment
Я оказался на этой странице, потому что CAPTCHA / reCAPTCHA в настоящее время не останавливает отправку формы ботом. Это 5 лет спустя, и это новый метод, чем когда был дан этот ответ. - person JohnnyFaldo; 25.09.2015
comment
Я удивлен, почему за этот ответ не набралось больше голосов. нравится это пользователю или нет, это отличное решение. Особенно, если он используется только для регистрационной формы. - person towi_parallelism; 08.03.2016
comment
В наши дни рекапча начинается с простого флажка, возможно, это не так болезненно, как раньше? ... - person rogerdpack; 15.02.2017
comment
ссылка недействительна. - person delta2flat; 19.04.2017
comment
reCaptcha также (намеренно) передает данные в Google. Не лучший вариант для уединения. - person Synchro; 21.08.2018

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

?>

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

person John Himmelman    schedule 05.03.2010
comment
Спасибо, хотя javascript можно легко отключить в любом браузере, тем самым уничтожив мой механизм защиты от спама, поэтому я ищу что-то более глобальное. - person Gal; 05.03.2010
comment
Я могу ошибаться, но разве это не скажет каждому пользователю с отключенным JS: «Вы плохой клиент, уходите, пожалуйста»? - person Gal; 05.03.2010
comment
Gal, это тривиальный пример, просто демонстрирующий, как выполнить проверку на соответствие запросу var, установленному клиентским js. - person John Himmelman; 05.03.2010
comment
@John Himmelman Капчи разрешимы и не обязательно являются лучшей защитой от спама. Существуют платные услуги, такие как anti-captcha.com, которые позволяют вводить капчи за небольшую плату. - person ; 13.11.2015
comment
Проблема с этим подходом в том, что я видел много ботов, использующих PhantomJS. Это позволит им пройти. - person Parham Doustdar; 14.06.2016
comment
@ParhamDoustdar Согласен, я ответил на этот вопрос примерно за год до выпуска PhantomJS :(. - person John Himmelman; 07.07.2016

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

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


Плюсы:

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

Минусы:

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


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

person Gras Double    schedule 16.02.2015
comment
Не могли бы боты, использующие такие вещи, как PhantomJS, легко обойти это? - person Parham Doustdar; 14.06.2016
comment
Поскольку это полноценный движок браузера, который загружает ресурсы и тому подобное, да, это должно быть возможно. Тем не менее, я не уверен, что его часто используют для спам-ботов, поскольку он, вероятно, намного медленнее, чем скрипты cURL. - person Gras Double; 14.06.2016
comment
по какой причине это было бы лучше, чем токен CSRF? - person xenoterracide; 20.01.2017
comment
токен CSRF вообще не остановит бота. 1-й запрос, ПОЛУЧИТЕ форму, содержащую токен. 2-й запрос, отправьте форму POST, включая токен. - person Gras Double; 20.01.2017

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

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

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

person Adam    schedule 06.04.2016
comment
Мне кажется, что сам факт, что вы должны поместить альтернативный текст, означает, что ваше решение с двумя изображениями так же подвержено сценариям, как и другие альтернативы. А для кнопки «Я не спамер»: нельзя ли это тоже написать? - person Hawkeye; 20.05.2020
comment
@Hawkeye Я ответил, что безголовый браузер может эмулировать все, что угодно: javascript, задержки, перемещение мыши, скрытые поля, ... Термин "красивый" до моих примеров был в некотором роде саркастичным. Но эти примеры показывают, что понимание английского языка и необходимость сделать простой выбор сложнее для спам-бота, чем: ожидание 10 секунд, обработка CSS или javascript, знание того, что поле скрыто, имитация движения мыши или имитация набора текста с клавиатуры, ... - person Adam; 21.05.2020
comment
Теперь я понимаю вашу точку зрения. Может быть, добавить последнее утверждение. Но эти примеры иллюстрируют ... и т. Д. К вашему ответу. Потому что это помогло мне понять, что вы имеете в виду. Поначалу это казалось самопротиворечивым аргументом, что мы не можем предполагать, что боты не могут ... но затем перечислите вещи, которые мы все еще не можем предположить, что боты не могут. Но суть вашей точки зрения заключается в том, что ваш пример (необходимость выбора кнопки отправки) сложнее - что (теперь, как я понимаю) является блестящим ответом. +1 - person Hawkeye; 21.05.2020

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

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

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

person SF.    schedule 05.03.2010
comment
Я знаю, что этому ответу почти 7 лет, но я чувствую, что это стоит прокомментировать. Многие боты могут быть запрограммированы на игнорирование полей со стилем = display: none, чтобы избежать этого типа защиты. - person Kenny Johnson; 20.02.2017
comment
Существуют десятки методов скрытия входных данных с использованием Javascript, отображения над ними фиктивных элементов, перемещения их из видимой области, их стилизации для идеального смешивания с фоном или декорациями макета и т. Д. of hashed = ›original на стороне сервера сеанса) поможет избежать использования имен в качестве подсказок и ручного сопоставления допустимых входных данных. Тем не менее, от ручного спама нет защиты. - person SF.; 14.02.2020

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

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

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

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

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

person user2643367    schedule 01.08.2013

Я думаю о многом здесь:

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

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

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

person Community    schedule 05.03.2010
comment
Хорошая идея. Я бы не стал использовать цвет в качестве критерия, так как это может исключить пользователей с дальтонизмом. - person Neil Aitken; 05.03.2010
comment
Да, хорошее замечание. На самом деле проблема с изображениями в целом заключается в том, что они недоступны, и, сделав их доступными с помощью тегов alt, роботы могут легко их понять. - person Brian; 05.03.2010
comment
Изображения всегда плохая идея ... текст с трудом читается, я сталкивался с этой проблемой на других сайтах - person valicu2000; 11.01.2015
comment
Это всего лишь капча с очень маленьким поворотом, который усложняет пользователям задачу. И вообще недоступен. - person Mihai P.; 14.10.2015

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

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

person Nick Allen    schedule 05.03.2010
comment
Умные роботы могут выполнять javascript. Используя решение javascript, вы блокируете 99% роботов. - person Ben Scheirman; 05.03.2010
comment
Если бот является плагином для браузера, он сможет выполнять javascript и видеть то, что видит пользователь (даже если вы выполняете рендеринг в формате flash или webgl). - person CoffeDeveloper; 11.01.2015
comment
Просто используйте CSS, чтобы разместить текстовое поле над страницей, если вы беспокоитесь о людях, у которых отключен JavaScript. - person Chewie The Chorkie; 02.12.2015

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

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

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

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

ИЗМЕНИТЬ

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

person Thibault Falise    schedule 05.03.2010
comment
Как пользователь, я ненавижу эту чушь. Я понимаю, что спам - это проблема, но какова моя проблема как пользователя сайта? Спам в комментариях - это проблема для владельца сайта, и поэтому пользователь не должен брать на себя бремя предотвращения его. Если бы вы вошли в магазин и вас попросили надеть защитные ботинки на обувь, потому что они не хотели мыть швабру, что бы вы тогда подумали? Это займет всего несколько секунд, но это не ваша ноша. - person Mike; 11.03.2015
comment
Спам @Miki заставляет владельца сайта зря тратить время. Время - деньги, то, что я продаю, будет для вас дороже. Ваш аргумент можно легко использовать, чтобы сказать, что меня не волнует, что вы должны платить арендную плату, я хочу оплатить стоимость производства + 1 доллар. Как вы платите за аренду, моя проблема. Когда вы что-то покупаете, вы платите за хостинг, транспорт, время и т. Д. - person Mihai P.; 14.10.2015
comment
@Mike - это ваша проблема, потому что вы хотите, чтобы форма работала (очевидно, раз уж вы ее используете). Машины находят даже самые малоизвестные сайты и ежедневно рассылают спам десятки тысяч материалов, делая эти формы непригодными для использования. Итак, в следующий раз, когда вы отправите вопрос малому бизнесу, используя форму на их веб-сайте, вам нужно будет добавить 9 + 3, чтобы сделать это ... и спросите себя, почему я должен это делать? ваш ответ может быть потому, что я действительно хочу получить ответ на свой вопрос. - person Jimbo Jonny; 27.03.2016
comment
@JimboJonny Вы полностью упустили мою точку зрения. Спам - это проблема (как я уже сказал), но есть способы решить ее на бэкэнде, которые не портят пользовательский опыт. В настоящее время у меня есть контактные формы, развернутые на десятках (сотнях, даже) веб-сайтов, и спам минимален (несколько спам-сообщений в месяц на каждую форму), потому что я боролся со спамом программно, а не заставляя пользователей прыгать через обруч. Я не хотел сказать, что спам - это не проблема; это проблема. Я хотел сказать, что есть способы решить эту проблему без искажения опыта пользователя. - person Mike; 31.03.2016
comment
@JimboJonny В качестве примера, посмотрите на самые высокие (и принятые) ответы на этот вопрос. Ни один из них не требует какого-либо пользовательского ввода. Таким должно быть смягчение спама. - person Mike; 31.03.2016
comment
@Mike - да ... так что, когда у вас есть сотни форм на сотнях веб-сайтов, которые полагаются на скрытое поле приманки, и внезапно более популярные производители программ-ботов просто добавляют новую функцию, чтобы определить, скрыто ли поле через CSS ( не так уж и сложно) у вас будет, что ... миллион или около того спам-сообщений в час, которые нужно внезапно очистить, и сотни веб-сайтов, которые нельзя будет использовать, пока вы не получите новое решение? Я вижу, тебе нравится жить опасно, мой друг. - person Jimbo Jonny; 31.03.2016
comment
@JimboJonny Я никогда не говорил, что полагаюсь исключительно на приманку, но существует комбинация аналогичных эффективных методов. Вы понимаете, что я мог бы написать точно такой же комментарий о методе ввода данных пользователем, верно? Компьютер никогда не сможет дать ответ на простую математическую задачу ... - person Mike; 01.04.2016
comment
@Mike - Простая математика тоже не очень хороша (желателен более сложный пользовательский ввод), но все же намного сложнее создать ИИ для распознавания математики на странице и ее соответствия полю (это сложная часть). Я использовал пример с приманкой, но идея этих простых, но непонятных исправлений (например, принятого ответа) - это то, к чему я стремлюсь. Эти ответы работают ИСКЛЮЧИТЕЛЬНО, потому что этот метод недостаточно распространен, чтобы создатели ботов потратили пару часов, чтобы его обойти. Это безопасность через неизвестность ... которая работает до тех пор, пока она не перестанет быть скрытой, а затем катастрофически взрывается. - person Jimbo Jonny; 01.04.2016
comment
@JimboJonny AI, подобный этому, существует с 1960-х годов ... вот почему практически все надежные утилиты типа captcha полагаются не только на человеческий вклад. Но ясно, что вы не понимаете мою точку зрения, поэтому я отвлекся. Продолжайте думать, что падение дымящейся кучи на пользовательский интерфейс - это способ справиться с чем-то, что должно (и может) решаться программно. - person Mike; 01.04.2016
comment
@Mike - Математика - не самая сложная часть. Очень немногие могут визуализировать страницу и надежно пространственно / лингвистически анализировать визуальные отношения между веб-сайтами, чтобы выяснить, какие поля и что нужно, с точки зрения человека. Люди делают это от рождения. В этом главное отличие бота от человека. Остальные слишком легко подделать. Вот почему методы ввода работают так хорошо. С другой стороны для каждого метода без ввода, перечисленного на этой странице, я мог бы довольно легко запрограммировать обходной путь, теперь, когда я знаю, что люди его используют. Неизвестность была всем, что у них было. Если у вас есть тот, который не так зависит от безвестности, поделитесь. - person Jimbo Jonny; 01.04.2016

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

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

person Pool    schedule 05.03.2010

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

person matthew    schedule 14.05.2010

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

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

person h0mayun    schedule 19.05.2014
comment
Интересная идея! Вы вообще использовали это в реальном мире? - person skybondsor; 02.07.2016
comment
Это не сработает. В наши дни спамеры используют программное обеспечение, которое запускается в браузере. Таким образом, они могут имитировать взаимодействие с пользователем, которое создает файл cookie, а затем запускает его x количество раз, используя различный контент, созданный программным обеспечением. - person Norbert Norbertson; 02.08.2016
comment
Это не сработало бы, если бы пользователь не использовал мышь. Если ваша форма настроена правильно, пользователь сможет заполнить всю форму с помощью клавиатуры. Вы можете перейти к следующим полям, использовать пробел для выбора переключателей и использовать пробел (или ввод), когда вы переходите на кнопку отправки. - person Kenny Johnson; 20.02.2017

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

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

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

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

person CoffeDeveloper    schedule 11.01.2015

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

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

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

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

person Robidu    schedule 18.01.2016

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

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

person cookie    schedule 20.02.2016

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

}
person Harika Y    schedule 09.09.2016

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

person nmit026    schedule 12.12.2017
comment
Из любопытства, что вы чувствуете по поводу reCAPTCHA? Вы первым упомянули другие платные услуги, но как они соотносятся с reCAPTCHA и / или почему вы бы порекомендовали их ПО БЕЗ бесплатного сервиса? - person Hawkeye; 20.05.2020

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

person Santi Nunez    schedule 14.02.2017

Решил добавить еще один ответ, извините.

Мы используем комбинацию двух:

  1. Поле приманки с name="email" (уже упоминалось в других ответах), просто обязательно используйте изощренный способ скрыть его, например, уйти с экрана или что-то в этом роде. Поскольку боты могут обнаруживать display:none
  2. Скрытое поле, которое задается JavaScript, когда пользователь clicks (или focuses, если вы хотите быть удобным для TAB) в обязательном поле (не упоминалось в других ответах)

Второй вариант может даже защитить от спама типа headless-browser (с использованием phatnom.js или Selenium), потому что даже JavaScript-боты не беспокоят фактического нажатия на текстовые поля.

Блокирует 99% ботов.

PS. Обязательно используйте фокусировку только на тех полях, которые не заполняются менеджерами паролей, такими как LastPass или 1Passwor.

По тем же причинам - отметьте свою приманку знаком autocomplete="false" tabindex="-1".

person Alex from Jitbit    schedule 24.11.2020

Использовать:

  1. форма с токенами
  2. Проверьте форму, чтобы сформировать задержку с IP-адресом
  3. Заблокировать IP (необязательно)
person Vivian    schedule 11.01.2015

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

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

person MartinWebb    schedule 14.07.2016