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


105

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

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

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

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


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

Ответы:


73

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

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

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

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


9
Будьте осторожны, если вы хотите разрешить конечным пользователям использовать автоматические средства заполнения форм, такие как addons.mozilla.org/en-US/firefox/addon/1882, которые могут обеспечить очень быструю отправку. Кроме капчи, любая вещь, которая раздражает конечного пользователя, как правило, нехороша, особенно если она мешает человеку, находящемуся в беде, действовать (очень) быстро.
снежинка

1
Хорошая мысль, но все зависит от контекста. Если форма является формой входа, я полностью с вами согласен. Но зачем отключать вход от ботов? Если контекст - это поле для комментариев, как это в StackOverflow, я точно знаю: если вы используете автозаполнение в поле для комментариев, то вы спамер. Обратите внимание, что если вы используете автозаполнение для подписей, вам все равно потребуется время для ввода содержимого.
Pindatjuh 05

5
Обратите внимание, что SO делает что-то вроде этого. Отредактируйте комментарий слишком быстро или слишком много раз подряд, и вы увидите вопрос «Вы человек?» страница.
Якоб Борг

2
Хакеры не всегда запрашивают форму. Иногда тщательно созданного URL-адреса (с использованием GET или POST) будет достаточно для многократной публикации формы без особых усилий.
crafter

1
Реализуйте это с помощью капчи. Если форма была отправлена ​​слишком быстро, укажите капчу, чтобы позволить подлинным пользователям пройти.
Yashovardhan99

75

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

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

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

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


1
Как вы думаете, боты действительно просматривают файл css и понимают, что он display: none; ? Я действительно предпочитаю не использовать решение на основе JS, так как его можно легко отключить.
Gal

1
Похоже, это старое решение для веб-мастеров, включающее массу неуместных ключевых слов для повышения их рейтинга. Я думаю, что поисковые роботы, такие как Google, могут понять, что он отображается: нет. Почему другие боты не могут этого сделать?
снежинка

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

25
Небольшой момент здесь: чтобы обойти проблему с JS, просто используйте CSS, чтобы разместить ввод приманки над верхней частью страницы - таким образом можно будет отключить js, а чтобы обойти это, бот должен будет иметь возможность анализировать CSS. абсолютное позиционирование и здравый смысл принять решение о том, приманка это или нет. немного больше пуленепробиваемости таким образом :)
полностьюNotLizards

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

22

Что если - Бот не находит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
`dsaZusil@kddGDHsj.com`
  • После использования указанного выше 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"> после (!) В «бот-приманки» вход для фактического адреса электронной почты пользователя.

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

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


7
Может ли браузер обычного пользователя потенциально видеть поле ввода приманки как поле электронной почты и автоматически заполнять его, когда пользователь выбирает автозаполнение остальной части формы? Пользователь не увидит, что поле за пределами экрана заполнено, и они все равно будут выглядеть как бот.
wilbbe01

Подозреваю, autocomplete=nopeчто по умолчанию on;-) MDN: input # attr-autocomplete
handle

@handle это не имеет значения, это ввод приманки для бота. Вы можете писать autocomplete="oh sunny day"по этому поводу.
Roko C. Buljan

19

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

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

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


1
Хорошая идея, однако, я бы установил ограничение от 3 до 5 секунд, чтобы позволить быстрым / опытным пользователям. Я использую тот же подход и устанавливаю ограничение на свои формы до 3 секунд, отфильтровывая 99% ботов.
Kayla

@adnhack Вы имеете в виду что-то вроде: 1) при загрузке страницы с помощью php получить время сервера и создать сеанс. 2) пользователь или бот заполняет форму, нажимает «Отправить» и $.postотправляет все во внешний php файл. 3) во внешнем php снова получить время сервера и сравнить со временем сеанса?
Андрис

16

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

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

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


Интересно, знаете ли вы, что он более эффективен, чем другие ответы ... скрытое текстовое поле или отслеживание времени, необходимого для заполнения формы?
Остин Хенли,

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

Мне это нравится! Пока бот не начнет пробовать разные комбинации пустых и заполненных полей ... лучший способ проверить это реализовать и просканировать с помощью одного из них: sectoolmarket.com/…
nmit026

Эффективен, поскольку человек, управляющий ботом, не узнает и не настраивает код.
Талха Аван

11

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


2
Добавьте это в качестве комментария, когда у вас будет больше репутации, а не ответа;)
Роб

3
Это создает проблемы с доступностью. Индекс приманки не будет скрыт от пользователей программ чтения с экрана.
Otterfan 07

5
Я слепой пользователь, и однажды я нашел такое поле формы, и надпись над ним гласила: «Если вы видите это, оставьте это поле пустым». Очень эффективный ИМО.
Parham Doustdar

8

http://recaptcha.net/

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

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

Также см


5
Как пользователь, мне часто бывает трудно понять recaptcha. Некоторые слова так трудно читать, что вам придется попробовать 3 или 4 раза. Хотя это определенно поможет с проблемой роботов.
Брайан

Что сказал Брайан и: yro.slashdot.org/story/10/03/02/0135238/…
SF.

Я оказался на этой странице, потому что CAPTCHA / reCAPTCHA в настоящее время не останавливает отправку формы бота. Это 5 лет спустя, и это новая техника, чем когда был дан этот ответ
JohnnyFaldo

Я удивлен, почему этот ответ не набрал больше голосов. нравится это пользователю или нет, это отличное решение. Особенно, если он используется только для регистрационной формы.
towi_parallelism 08

В наши дни рекапча начинается с простого флажка, может быть, это не так больно, как раньше? ...
rogerdpack

6

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

?>

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


Спасибо, хотя javascript можно легко отключить в любом браузере, тем самым уничтожив мой «механизм защиты от спама», поэтому я ищу что-то более глобальное.
Гал,

Я могу ошибаться, но разве это не говорит каждому пользователю с отключенным JS: «Вы плохой клиент, уходите, пожалуйста»?
Gal

Гал, это тривиальный пример, просто демонстрирующий, как выполнить проверку по запросу var, установленному клиентским js.
Джон Химмельман

@John Himmelman Captcha решаемы, и это не обязательно лучшая защита от спама. Существуют платные услуги, такие как anti-captcha.com , которые решают капчи с формы за небольшую плату.

Проблема с этим подходом в том, что я видел много ботов, использующих PhantomJS. Это позволит им пройти.
Parham Doustdar

4

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

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


Плюсы:

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

Минусы:

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


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


Не могли бы боты, использующие такие вещи, как PhantomJS, легко обойти это?
Parham Doustdar

1
Поскольку это полноценный движок браузера, который загружает ресурсы и тому подобное, да, это должно быть возможно. Тем не менее, я не уверен, что его часто используют для спам-бота, поскольку он, вероятно, намного медленнее, чем скрипты cURL.
Gras Double

по какой причине это было бы лучше, чем токен CSRF?
xenoterracide

1
токен CSRF вообще не остановит бота. 1-й запрос, ПОЛУЧИТЕ форму, которая включает токен. 2-й запрос, отправьте форму POST, включая токен.
Gras Double

4

С появлением безголовых браузеров (таких как 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, знать, что поле скрыто, имитировать движение мыши или эмуляция набора текста с клавиатуры, ...


Мне кажется, что сам факт, что вы должны добавить альтернативный текст, означает, что ваше решение с двумя изображениями так же подвержено сценариям, как и другие альтернативы. А для кнопки «Я не спамер»: нельзя ли это тоже написать?
Соколиный глаз

@Hawkeye Я ответил, что безголовый браузер может эмулировать все : javascript, задержки, перемещение мыши, скрытые поля, ... Термин «красивый» до моих примеров был в некотором роде «саркастическим». Но эти примеры показывают, что понимание английского языка и необходимость сделать простой выбор сложнее для спам-бота, чем: ожидание 10 секунд, обработка CSS или javascript, знание того, что поле скрыто, имитация движения мыши или имитация набора текста с клавиатуры, ...
Адам

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

3

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

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

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


2
Я знаю, что этому ответу почти 7 лет, но я чувствую, что его стоит прокомментировать. Многие боты могут быть запрограммированы так, чтобы игнорировать поля со стилем = "display: none", чтобы избежать этого типа защиты.
Кенни Джонсон,

Существуют десятки методов скрытия входных данных с использованием Javascript, отображения поверх них фиктивных элементов, перемещения их из видимой области, их стилизации для идеального смешивания с фоном или декорациями макета и т. Д. Рандомизация (хеширование) имен входов (и сохранение сопоставления of hashed => original на стороне сервера сеанса) поможет избежать использования имен в качестве подсказок и ручного сопоставления допустимых входных данных. Тем не менее, от ручного спама нет защиты.
SF.

2

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

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

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

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

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


1

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

  1. использование JS (хотя вы этого не хотите) для отслеживания движения мыши, нажатия клавиш, щелчка мыши
  2. получение URL-адреса реферала (который в данном случае должен быть из того же домена) ... обычный пользователь должен пройти по веб-сайту, прежде чем перейти к контактной форме: 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. Используйте поддельную страницу до / после формы, просто чтобы отправить еще один ввод

Не могли бы вы подробнее рассказать о некоторых из этих шагов valicu2000? Действуют ли они еще в 2020 году? Спасибо.
Майкл Мориарти

0

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

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


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

Да, хорошее замечание. На самом деле проблема с изображениями в целом заключается в том, что они недоступны, и, сделав их «доступными» с помощью тегов alt, роботы могут легко их понять.
Брайан

Изображения всегда плохая идея ... текст с трудом читается, я сталкивался с этой проблемой на других сайтах
valicu2000

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

0

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

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


4
Умные роботы могут выполнять javascript. Тем не менее,
создавая

Если бот представляет собой плагин для браузера, он сможет выполнять javascript и видеть то, что видит пользователь (даже если вы выполняете рендеринг в формате flash или webgl)
CoffeDeveloper

Просто используйте CSS, чтобы разместить текстовое поле над страницей, если вы беспокоитесь о людях, у которых отключен JavaScript.
Chewie The Chorkie

0

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

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

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

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

РЕДАКТИРОВАТЬ

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


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

Спам @Miki заставляет владельца сайта тратить время зря. Время - деньги, то, что я продаю, будет для вас дороже. Ваш аргумент можно легко использовать, чтобы сказать: «Меня не волнует, что вы должны платить за аренду, я хочу оплатить стоимость производства + 1 доллар. Как вы платите за аренду, моя проблема». Когда вы что-то покупаете, вы платите за хостинг, транспорт, время и т. Д.
Михай П.

@Mike - это ваша проблема, потому что вы хотите, чтобы форма работала (очевидно, раз уж вы ее используете). Машины находят даже самые малоизвестные сайты и ежедневно рассылают спам десятки тысяч материалов, делая эти формы непригодными для использования. Поэтому в следующий раз, когда вы отправите вопрос малому бизнесу, используя форму на их веб-сайте, вам нужно будет добавить 9 + 3, чтобы сделать это ... и спросить себя: «Почему я должен это делать?» ваш ответ может быть таким: «потому что я действительно хочу получить ответ на свой вопрос».
Джимбо Джонни,

@JimboJonny Ты полностью упустил мою точку зрения. Спам - это проблема (как я уже сказал), но есть способы решить ее на бэкэнде, которые не портят пользовательский опыт. В настоящее время у меня есть контактные формы, развернутые на десятках (сотнях, даже) веб-сайтов, и спам минимален (несколько спам-сообщений в месяц на каждую форму), потому что я устранял спам программно, а не заставлял пользователей прыгать через обруч. Я не хотел сказать, что спам - это не проблема; это проблема. Я хотел сказать, что есть способы решить эту проблему, не обманывая пользователя.
Майк

@JimboJonny В качестве примера, посмотрите на самые высокие (и принятые) ответы на этот вопрос. Ни один из них не требует какого-либо пользовательского ввода. Таким должно быть смягчение спама.
Майк

0

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

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


0

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


0

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

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


Интересная идея! Вы вообще использовали это в реальном мире?
skybondsor 02

Это не сработает. В наши дни спамеры используют программное обеспечение, которое запускается в браузере. Таким образом, они могут имитировать пользовательский опыт, который создает файл cookie, а затем запускает его x количество раз, используя различный контент, созданный программным обеспечением.
Норберт Норбертсон 02

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

0

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


0

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

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

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

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


0

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

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

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

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


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

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


0

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

}

0

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


Из любопытства, что вы думаете о reCAPTCHA? Вы первым упомянули другие платные услуги, но как они соотносятся с reCAPTCHA и / или почему вы бы порекомендовали их БЕЗ бесплатного сервиса?
Соколиный глаз

0

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


-1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.