Как запретить роботам автоматически заполнять форму?
Я пытаюсь придумать достаточно хороший механизм защиты от спама, чтобы предотвратить автоматически сгенерированный ввод. Я читал, что методы, такие как капча, 1+1=? все работает хорошо, но они также представляют собой дополнительный шаг, препятствующий бесплатному быстрому использованию приложения (я не ищу ничего подобного, пожалуйста).
Я попытался установить некоторые скрытые поля во всех моих формах, с display: none;
Тем не менее, я уверен, что скрипт можно настроить так, чтобы он отслеживал идентификатор поля формы и просто не заполнял его.
Реализуете ли вы / знаете ли вы хороший анти-автоматический метод заполнения форм-роботов? Есть ли что-то, что может быть выполнено без проблем с обработкой на сервере HTML И / ИЛИ и быть (почти) пуленепробиваемым? (без JS как можно было бы просто отключить).
Я пытаюсь не полагаться на сессии для этого (т.е. подсчитывать, сколько раз нажата кнопка, чтобы предотвратить перегрузки).
27 ответов
Простой в реализации, но не защищенный от ошибок (особенно при "определенных" атаках) способ устранения спама - отслеживание времени между отправкой формы и загрузкой страницы.
Боты запрашивают страницу, анализируют страницу и отправляют форму. Это быстро.
Люди вводят URL-адрес, загружают страницу, ждут, пока страница полностью не загрузится, прокручивают страницу вниз, читают содержимое, решают, комментировать / заполнять форму, требуют времени для заполнения формы и отправки.
Разница во времени может быть незначительной; и для того, чтобы отслеживать это время без файлов cookie, требуется какой-либо способ создания базы данных на стороне сервера. Это может повлиять на производительность.
Также вам нужно настроить пороговое время.
Я действительно считаю, что простое поле Honey Pot работает хорошо. Большинство ботов заполняют каждое поле формы, которое они видят, в надежде обойти обязательные валидаторы полей.
http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx
Если вы создаете текстовое поле, скрываете его в javascript, а затем проверяете, что значение на сервере пустое, это отсеивает 99% роботов и не вызывает у 99% ваших пользователей никакого разочарования. Оставшиеся 1%, у которых отключен JavaScript, будут по-прежнему видеть текстовое поле, но вы можете добавить сообщение типа "Оставьте это поле пустым" для таких случаев (если вы заботитесь о них вообще).
(Кроме того, отмечая, что если вы делаете style="display:none" на поле, то для робота слишком просто просто увидеть это и отбросить поле, поэтому я предпочитаю подход javascript).
Что делать, если бот не находит form
совсем?
3 примера:
1. Вставьте вашу форму, используя AJAX
если у вас все в порядке с пользователями, у которых отключен JS и вы не можете видеть / отправить форму... Вы всегда можете уведомить их, используя <noscript><p class="error">ERROR: The form could not be loaded. Please, re-enable JavaScript in your browser to fully enjoy our services.</p></noscript>
, чем,
- Создать
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's on() Method
input : function() {
console.log( this.value );
}
}
});
// MESSAGE TEXTAREA
$("<textarea/>",{
name : "Message", // Needed for serialization
placeholder : "Your message",
appendTo : $form
});
// SUBMIT BUTTON
$("<input/>",{
type : "submit",
value : "Send",
name : "submit",
appendTo : $form
});
function AJAXSubmitForm(event) {
event.preventDefault(); // Prevent Default Form Submission
// do AJAX instead:
var serializedData = $(this).serialize();
alert( serializedData );
$.ajax({
url: '/mail.php',
type: "POST",
data: serializedData,
success: function (data) {
// log the data sent back from PHP
console.log( data );
}
});
}
.myForm input,
.myForm textarea{
font: 14px/1 sans-serif;
box-sizing: border-box;
display:block;
width:100%;
padding: 8px;
margin-bottom:12px;
}
.myForm textarea{
resize: vertical;
min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>
3. Бот приманки
боты, как (действительно, как) дерзкие элементы ввода, такие как:
<input
type="text"
name="email"
id="email"
placeholder="Your email"
autocomplete="nope"
tabindex="-1" />
они будут рады ввести какое-то значение, как они делают dsaZusil@kddGDHsj.com
чем (после использования вышеупомянутого HTML), с помощью CSS сделать так:
input[name=email]{ /* bait input */
/*
don't use display:none or visibility:hidden
cause that will not fool the bot
*/
position:absolute;
left:-2000px;
}
теперь, когда ваш ввод не виден пользователю, ожидайте в PHP, что ваш $_POST["email"]
должно быть пустым (без какого-либо значения)! В противном случае не отправляйте форму.
Теперь все, что нужно сделать, это создать еще один вход, как <input name="sender" type="text" placeholder="Your email">
после (!) ввода "bot-bait" для фактического адреса электронной почты пользователя.)
Подтверждения:
Developer.Mozilla - Отключение автозаполнения формы
Stackru - игнорировать Tabindex
Я использовал скрытое поле и поместил на него метку времени, а затем сравнил его с меткой времени на сервере с использованием PHP.
Если это было быстрее, чем 15 секунд (зависит от того, насколько большие или маленькие ваши формы), то это был бот.
Надеюсь это поможет
Очень эффективный способ фактически устранить спам - это иметь текстовое поле с текстом, например "Удалить этот текст, чтобы отправить форму!" и этот текст должен быть удален, чтобы отправить форму.
После проверки формы, если текстовое поле содержит исходный текст или произвольный текст по этому вопросу, не отправляйте форму. Боты могут читать имена форм и автоматически заполнять поля "Имя" и "Электронная почта", но не знают, нужно ли им на самом деле удалять текст из определенного поля для отправки.
Я внедрил этот метод на нашем корпоративном сайте, и он полностью исключил спам, который мы получали ежедневно. Это действительно работает!
Как насчет создания поля ввода текстового поля того же цвета, что и фон, который должен оставаться пустым. Это позволит обойти проблему отображения чтения бота: нет
reCAPTCHA - это бесплатная антибот-служба, которая помогает оцифровывать книги
Он был получен Google (в 2009 году):
Также см
- https://en.wikipedia.org/wiki/ReCAPTCHA
- https://en.wikipedia.org/wiki/CAPTCHA для получения более общей информации
Многие из этих спам-ботов являются просто серверными сценариями, которые бродят по сети. Вы можете бороться со многими из них, используя некоторый 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.');
}
?>
Кроме того, капчи великолепны и действительно лучшая защита от спама.
С появлением безголовых браузеров (таких как 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" />
Из соображений доступности вы должны поставить правильную текстовую альтернативу, но я думаю, что длинное предложение лучше для пользователей программ чтения с экрана, чем для бота.
Я удивлен, что никто еще не упомянул этот метод:
- На своей странице включите небольшое скрытое изображение.
- Поместите куки при показе этого изображения.
- При обработке отправки формы проверьте наличие cookie.
Плюсы:
- удобно для пользователя и разработчика
- кажется надежным
- нет JavaScript
Минусы:
- добавляет один HTTP-запрос
- требует, чтобы куки были включены на клиенте
Например, этот метод используется плагином WordPress Cookies для комментариев.
Очень простой способ - предоставить некоторые поля, такие как <textarea style="display:none;" name="input"></textarea>
и откажитесь от всех ответов, которые заполнили это.
Другой подход заключается в создании всей формы (или только имен полей) с использованием Javascript; несколько ботов могут запустить его.
В любом случае, вы не будете делать ничего против живых "ботов" из Тайваня или Индии, которым платят по 0,03 доллара за одну опубликованную ссылку, и они зарабатывают на жизнь таким образом.
У меня есть простой подход к остановке спамеров, который на 100% эффективен, по крайней мере, по моему опыту, и избегает использования reCAPTCHA и подобных подходов. Я перешел от почти 100 спамов в день на html-формах одного из моих сайтов к нулю за последние 5 лет, как только я реализовал этот подход.
Он работает, используя возможности электронной почты ALIAS большинства сценариев обработки html-форм (я использую FormMail.pl) вместе с графическим представлением "кода", который легко создается в самых простых графических программах. Один такой рисунок включает в себя код M19P17nH и подсказку "Пожалуйста, введите код слева".
Этот конкретный пример использует случайную последовательность букв и цифр, но я склонен использовать неанглоязычные версии слов, знакомые моим посетителям (например, "pnofrtay"). Обратите внимание, что подсказка для поля формы встроена в графику, а не отображается в форме. Таким образом, для робота это поле формы не имеет представления о его назначении.
Единственный реальный трюк заключается в том, чтобы убедиться, что html вашей формы назначает этот код переменной "получатель". Затем в своей почтовой программе убедитесь, что каждый такой код, который вы используете, установлен как псевдоним электронной почты, который указывает на любые адреса электронной почты, которые вы хотите использовать. Поскольку в форме нет подсказок для чтения роботом и адресов электронной почты, он не знает, что поместить в пустое поле формы. Если в поле формы ничего не помещается или что-либо, кроме допустимых кодов, отправка формы завершается с ошибкой "неверный получатель". Вы можете использовать различную графику в разных формах, хотя в моем опыте это не так уж необходимо.
Конечно, человек может решить эту проблему в одно мгновение, без проблем, связанных с reCAPTCHA и подобными, более изящными схемами. Если человек-спамер реагирует на сбой получателя и программирует код изображения в роботе, вы можете легко изменить его, как только поймете, что робот жестко запрограммирован на ответ. За пять лет использования этого подхода у меня никогда не было спама ни в одной из форм, в которых я его использую, и у меня никогда не было жалоб от любого человека-пользователя форм. Я уверен, что это может быть побеждено с помощью функции OCR в роботе, но у меня никогда не было такого на любом из моих сайтов, которые используют HTML-формы. Я также использовал "ловушки для спама" (скрытый html-код "приходи сюда", который указывает на мои политики борьбы со спамом), но они были эффективны только на 90%.
Я думаю о многих вещах здесь:
- использование JS (хотя вы этого не хотите) для отслеживания движения мыши, нажатия клавиш, щелчка мыши
- получение URL-адреса реферала (который в данном случае должен быть одним и тем же доменом) ... обычный пользователь должен перейти по веб-сайту, прежде чем получить контактную форму: PHP: как получить URL-адрес реферера?
- использование переменной $_SESSION для получения IP-адреса и проверки отправки формы по этому списку IP-адресов.
- Заполните одно текстовое поле фиктивным текстом, который вы можете проверить на стороне сервера, если он был перезаписан
- Проверьте версию браузера: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html... Понятно, что бот не будет использовать браузер, а только скрипт,
- Используйте AJAX, чтобы отправить поля одно за другим и проверить разницу во времени между отправками
- Используйте поддельную страницу до / после формы, просто чтобы отправить другой вклад
Самый простой способ, который я нашел, - это поместить поле со значением и попросить пользователя удалить текст в этом поле. так как боты только заполняют их. если поле не пустое, это означает, что пользователь не является человеком, и оно не будет опубликовано. Это то же самое, что и код с картинки.
Другой вариант вместо того, чтобы делать случайные буквы и цифры, как это делают многие веб-сайты, - это делать случайные изображения узнаваемых объектов. Затем попросите пользователя ввести цвет какого-либо рисунка или сам объект.
В общем, каждое решение будет иметь свои преимущества и недостатки. Вам нужно будет найти счастливую медиану между слишком сложным для пользователей, чтобы пройти механизм антиспама и количеством спам-ботов, которые могут пройти.
Я добавил проверку времени в мои формы. Формы не будут отправлены, если заполнены менее чем за 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
}
Решил добавить еще один ответ, извините.
Мы используем комбинацию двух:
- Поле приманки с
name="email"
(уже упоминалось в других ответах), просто обязательно используйте изощренный способ скрыть это, например, уйти с экрана или что-то в этом роде. Поскольку боты могут обнаруживатьdisplay:none
- Скрытое поле, которое задается JavaScript, когда пользователь
clicks
(или жеfocuses
если вы хотите быть TAB-friendly) в обязательном поле (не упоминалось в других ответах)
Второй вариант может даже защитить от спама типа headless-browser (с использованием phatnom.js или Selenium), потому что даже JavaScript-боты не беспокоят фактического нажатия на текстовые поля.
Блокирует 99% ботов.
PS. Обязательно используйте фокусировку только на тех полях, которые не заполняются менеджерами паролей, такими как LastPass или 1Passwor.
По тем же причинам - отметьте приманку
autocomplete="false" tabindex="-1"
Это просто идея, id использовал это в моем приложении и хорошо работает
Вы можете создать cookie при перемещении мыши с помощью javascript или jquery и при проверке на стороне сервера, если cookie существуют, потому что мышь есть только у людей, cookie могут быть созданы только с их помощью, cookie может быть временной меткой или токеном, который может быть проверен
Лучшее решение, которое я нашел, чтобы избежать спама от ботов, - это использовать очень простой вопрос или поле в вашей форме.
Попробуйте добавить поле, подобное этому:
- Скопируйте "привет" в коробку в сторону
- 1+1 =?
- Скопируйте название сайта в поле
Эти трюки требуют от пользователя понимания того, что должно быть введено в форму, что значительно усложняет задачу массивного заполнения формы бота.
РЕДАКТИРОВАТЬ
Задняя сторона этого метода, как вы указали в своем вопросе, является дополнительным шагом для пользователя, чтобы проверить его форму. Но, на мой взгляд, это намного проще, чем капча, и накладные расходы при заполнении формы не превышают 5 секунд, что кажется приемлемым с точки зрения пользователя.
С появлением все более изощренных спам-ботов и методов, таких как автоматизированные браузеры, определить источник спама будет сложнее. Но независимо от того, является ли спам спамом, человеком или тем и другим, спам из-за его содержания. Я думаю, что лучшее решение - запустить размещенный контент через API-интерфейс для защиты от спама, такой как Cleantalk или Akismet. Это относительно дешево и эффективно и не доставляет хлопот пользователю. Вы можете проверить время отправки формы и другие традиционные проверки для менее сложных роботов, прежде чем использовать API.
Используйте 1) форму с токенами 2) проверьте форму, чтобы сформировать задержку с IP-адресом 3) Block IP (необязательно)
По моему опыту, если форма является просто "контактной" формой, вам не нужны особые меры. Спам прилично фильтруется службами веб-почты (вы можете отслеживать запросы веб-форм с помощью серверных скриптов, чтобы увидеть, что эффективно достигает вашей электронной почты, конечно, я предполагаю, что у вас есть хороший сервис веб-почты:D)
Кстати, я стараюсь не полагаться на сессии для этого (например, подсчет, сколько раз нажата кнопка, чтобы предотвратить перегрузки).
Я не думаю, что это хорошо. Действительно, чего я хочу добиться, так это получать электронные письма от пользователей, которые выполняют определенные действия, потому что это те пользователи, которые мне интересны (например, пользователи, которые просмотрели страницу "CV" и использовали правильный контакт форма). Поэтому, если пользователь делает то, что я хочу, я начинаю отслеживать его сеанс и устанавливаю cookie (я всегда устанавливаю cookie сеанса, но когда я не запускаю сеанс, это просто поддельный cookie, созданный для того, чтобы считать, что у пользователя есть сеанс). Если пользователь делает что-то нежелательное, я не беспокоюсь о сохранении сеанса для него, поэтому никаких перегрузок и т. Д.
Также было бы неплохо, чтобы рекламные сервисы предлагали какие-то API-интерфейсы (возможно, они уже существуют), чтобы посмотреть, "смотрел ли пользователь объявление", вполне вероятно, что пользователи, просматривающие рекламу, являются реальными пользователями, но если они этого не делают очень хорошо, по крайней мере, вы получаете 1 просмотр в любом случае, так что ничего не потеряно. (и поверьте мне, контроль над рекламой более сложен, чем все, что вы можете сделать в одиночку)
Роботы не могут выполнять JavaScript, поэтому вы делаете что-то вроде внедрения какого-то скрытого элемента на страницу с помощью JavaScript, а затем обнаруживаете его присутствие перед отправкой формы, но будьте осторожны, потому что у некоторых ваших пользователей также отключен JavaScript
В противном случае я думаю, что вы будете вынуждены использовать форму доказательства клиента "человечности"
Я использую метод, где есть скрытое текстовое поле. Поскольку боты анализируют сайт, они, вероятно, заполняют его. Затем я проверяю, пусто ли оно, если нет, сайт возвращается обратно.
Добавьте подтверждение по электронной почте. Пользователь получает электронное письмо, и ему нужно нажать на ссылку. В противном случае откажитесь от поста через некоторое время.
Об этом есть учебник на сайте JQuery. Хотя это JQuery, идея не зависит от фреймворка.
Если JavaScript недоступен, вам, возможно, придется прибегнуть к подходу типа CAPTCHA.
На самом деле ловушка с дисплеем: ни один не работает как шарм. Это помогает переместить объявление CSS в файл, содержащий любые глобальные таблицы стилей, что также заставит спам-ботов загружать их (прямой стиль ="display:none;" объявление может быть интерпретировано спам-ботом, как и объявление локального стиля в самом документе).
Это в сочетании с другими контрмерами должно спровоцировать спам-ботов на разгрузку своего барахла (у меня есть гостевая книга, защищенная различными мерами, и пока они попадают в мои основные ловушки - однако, если любой бот обходит их, другие готовы к запуску).
Я использую комбинацию ложных полей формы (также описываемых как недопустимые поля в случае, если используется браузер, который не обрабатывает CSS вообще или не отображает: ни одного в частности), проверки работоспособности (то есть формат ввода допустимо?), отметка времени (как слишком быстрая, так и слишком медленная отправка), MySQL (для реализации черных списков на основе адресов электронной почты и IP-адресов, а также фильтров затопления), DNSBL (например, SBL+XBL от Spamhaus), анализ текста (например, слова, которые являются сильным указанием на спам) и электронные письма для проверки (чтобы определить, является ли указанный адрес электронной почты действительным).
Одно замечание о письмах с подтверждением: этот шаг не является обязательным, но когда кто-то решает его реализовать, этот процесс должен быть максимально простым в использовании (то есть он должен сводиться к щелчку по ссылке, содержащейся в электронном письме).) и сделать так, чтобы указанный адрес электронной почты был внесен в белый список на определенный период времени, чтобы избежать последующих проверок в случае, если пользователь захочет сделать дополнительные сообщения.
Вы можете попытаться обмануть спам-роботов, добавив правильный атрибут действия после проверки 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(), чтобы предотвратить ошибки
Только мои пять центов. Если цель этого состоит в том, чтобы остановить 99% роботов, что звучит довольно хорошо, и если 99% роботов не могут запустить Java-скрипт, лучшее решение, которое превосходит все, - просто не использовать форму, которая имеет действие отправки с почтовый URL.
Если форма контролируется с помощью java-скрипта и java-скрипт собирает данные формы и затем отправляет их через HTTP-запрос, ни один робот не может отправить форму. Так как кнопка отправки будет использовать Java-скрипт для запуска кода, отправляющего форму.