Защита от спама в форме обратной связи. Чем хороша эта форма? Принцип работы формы обратной связи на html

1. Генерация формы на стороне клиента с помощью JavaScript.

Впервые я применил этот подход на сайте «Свободна» 3 года назад.
За всё это время на сайте не появилось ни одного спам-сообщения, оставленного роботами. Только троллями. Но тролли - это другая история.

В основе этого метода лежит предположение, что спам-боты: 1) не умеют исполнять JavaScript, 2) даже если и умеют, то не работают со сгенерированным html-кодом.

Механизм работы такой. У вас есть JavaScript функция, которая умеет рисовать форму. Она может вызываться автоматически, например, после загрузки страницы или как реакция на определенные действия пользователя, например, после клика на ссылку «».

Простой пример генерации формы: //Функция, которая добавляет форму в конец страницы function appendForm(){ var form = " "+ "Ваше имя:
"+ "
"+ "Ваше сообщение:
"+ "
"+ ""+ " "; document.body.innerHTML+=form; } //Запустить функцию после загрузки документа window.onload = appendForm; Минусы:
  • Тяжело применить к сложным формам.
  • Форму не смогут отправить те 5% пользователей , у которых отключен JavaScript.
2. Использование капчи (captcha).

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

Основывается на предположении, что роботы: 1) не умеют читать с картинок, 2) даже если умеют, то плохо видят и не понимают плохо прорисованные символы.

Капч существует куча разновидностей с разной функциональностью. Последнее время стала довольно популярна reCaptcha .

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

Минусы: 3. Генерация скрытого поля на стороне клиента с помощью JavaScript.

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

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

А затем на стороне сервера проверяется было ли это поле среди отправленных, и если нет, то считается, что форма была отправлена роботом.

Пример кода на стороне клиента (JavaScript): //Функция, которая добавляет поле _antispam во все формы на странице function appendAntiSpamField(){ var forms = document.getElementsByTagName("form"); for(var i = 0,l = forms.length;i if(isset($_POST["_antispam"])){ //..продолжить обработку формы }else{ //..обработка ошибки echo "Сработал анти-спам фильтр." echo "Включите JavaScript, для того чтобы отправить форму."; exit; } Минусы:
  • Форму не смогут отправить те 5% пользователей , которые не используют JavaScript.
4. Проверка на наличие основного поля формы.

Бывает такое, что спаммеры пытаются отсылать информацию не используя формы на ваших страницах, а напрямую вашему серверу.

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

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

Пример кода на стороне сервера (PHP): if(isset($_POST["text_body"])){ //..продолжить обработку формы }else{ //..обработка ошибки echo "Спаммеры! Не балуйтесь!"; exit; }

Также никогда не забывайте проверять и чистить ВСЮ принимаемую информацию!

5. Ограничение количества ссылок в сообщении.

Это более сложный подход, основывающийся на анализе получаемых данных.

99.9% спаммерских сообщений включают в себя ссылки и адресса сайтов. Часто они пытаются впихнуть в одно сообщение несколько ссылок сразу. Также многие спам-боты знают о существовании различных систем обработки информации на сайтах и могут составлять свои сообщения в виде обычного текста, html, BB-кода и др.

Но в этом и их минус - их можно отсеивать по количеству ссылок в сообщении.

Это может быть сделано, например, так:

Пример простого кода на стороне сервера (PHP): //Функция, которая проверяет строку на наличие в ней ссылок //и возвращает false, если их число больше лимита. //По умолчанию, лимит равен 1 function fits_limit_links($str, $allowed_links=1){ //Искать http:// $pattern = "/http:///i"; preg_match_all($pattern, $str, $link_matches); //Если встречаются совпадения и их больше, чем $allowed_links, //то вернуть false, иначе вернуть true return (isset($link_matches) && count($link_matches) > $allowed_links)? false: true; } $allowed_links = 2; if(fits_limit_links($_POST["text_body"], $allowed_links)){ //..продолжить обработку формы }else{ //..обработка ошибки echo "Сработал анти-спам фильтр." echo "Сообщение может содержать не более чем " .$allowed_links ." ссылок"; exit; } Минусы: 6. Использование пустого поля, скрытого CSS. Дата: Опубликовано сообщений: из них спам: Отфильтрованный спам: Фильтр 1 Фильтр 2 Фильтр 3 Фильтр 4 Фильтр 5

Погрешность результатов исследования не составляет более 5%, но думаю, что она не больше 2%. Как блокированный спам могли быть записаны, например, неверные попытки пользователя набрать капчу или написать сообщение с более чем, одной ссылкой. Но поскольку количество «полезных» сообщений составляет всего 1%, то «живые» пользователи просто физически не могли существенно повлиять на статистику.

Итоги

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

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

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

Если будут какие-то вопросы - пишите мне, постараюсь ответить.

No pasaran!

Вы дочитали до самого конца страницы.

Три года назад на Хабре была опубликована статья , рассказывающая о принципиально отличном от CAPTCHA решении для PHP по защите форм от спам-ботов. Это решение основано на идеях, изложенных в своих статьях Филом Хааком (Phil Haack) - Honeypot Captcha и Недом Батчелдером (Ned Batchelder) - Stopping spambots with hashes and honeypots . К сожалению, предложенный в статье класс, написан для PHP4 и не развивается с 2007-го года. Хочу предложить вашему вниманию его аналог на PHP5.

Ботобор

Ботобор - библиотека, написанная на PHP 5.0, предназначенная для защиты от заполнения веб-форм роботами. Используемые ей методы, незаметны для посетителей-людей.

Для выявления роботов Ботобор использует следующие проверки:

  • несовпадение значения REFERER с URL, на котором расположена форма;
  • слишком маленький промежуток между показом формы и её отправкой (настраивается);
  • слишком большой промежуток между показом формы и её отправкой (настраивается);
  • заполнение поля-приманки.

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

ПримерыПростой пример
require "botobor.php" ;

// Получите разметку формы тем способом, который предусмотрен у вас в проекте, например:
$html = $form -> getHTML () ;
// Создайте объект-обёртку:

// Получите новую разметку формы
$html = $bform -> getCode () ;

Фрагмент кода, обрабатывающего данные формы:

require "botobor.php" ;

if (Botobor_Keeper:: isHuman () )
{
// Форма отправлена человеком, можно обрабатывать её.
} Пример настройки формыФрагмент кода, создающего форму:
// пусть $html содержит код формы
$bform = new Botobor_Form($html ) ;
// отключаем поля-приманки
$bform -> setCheck ("honeypots" , false ) ;
// устанавливаем нижний предел заполнения формы в 2 секунды
$bform -> setDelay (2 ) ;
// устанавливаем верхний предел заполнения формы в 60 минут
$bform -> setLifetime (60 ) ;
$html = $bform -> getCode () ;
В остальном всё также как и в первом примере.Что у ней внутре?Что делает Ботбор с кодом формы В конструкторе Botobor_Form принимает HTML-код формы. В этот код, после открывающего тега , добавляется скрытый (display: none) , содержащий input с мета-данными формы. Эти мета-данные хранят подписанную информацию о времени создания формы, установленных опциях и т. д. В этот же скрытый блок Ботобор может вставлять поля-приманки.Поля-приманки Поля-приманки предназначены для отлова роботов-пауков, которые находят формы самостоятельно. Такие роботы, как правило, ищут в форме знакомые поля (например, name) и заполняют их. Ботобор может добавить в форму скрытые от человека (при помощи CSS) поля с такими именами. Человек оставит эти поля пустыми (т. к. просто не увидит), а робот заполнит и тем самым выдаст себя.

По умолчанию в коде формы ищутся поля с любым из следующих имён: «name», «mail», «email» (список настраивается). У каждого найденного поля имя меняется на сгенерированную случайным образом комбинацию символов и создаётся скрытое средствами CSS поле с оригинальным именем.

Обратное преобразование имён будет сделано во время вызова метода Botobor_Keeper::handleRequest() или Botobor_Keeper::isHuman().

Буду рад, если кому-то пригодится.

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

Использование CSS для скрытия полей формы

Можно в форму добавить дополнительные поля, но скрыть их с помощью CSS, чтобы эти поля не были видны обычному, реальному посетителю сайта, т.е. чтобы ему не нужно было их заполнять. При отправке данных через форму, PHP-скрипт, обрабатывающий запрос на стороне сервера, должен проверять данные, переданные в запросе.

Поля HTML формы:

Hidefield { display:none; }

PHP скрипт, принимающий данные, отправленные из формы:

If ($_POST["anydata1"] != "" or $_POST["anydata2"] != "http://") { // если поле "anydata1" не пустое или // значение поля "anydata2" содержит строку, отличную от "http://" // то запрос НЕ принимается, т.е. данные не будут далее обрабатываться или сохраняться в БД } else { // принимаем данные запроса }

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

Использование Javascript для добавления CSS-класса к полям формы

С помощью Javascript можно немного улучшить выше описанный метод - к скрытым полям ввода можно добавлять соответствующий CSS-класс используя Javascript:

document.getElementById("anydata1").className = "hidefield";

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

Изменение имен полей формы с помощью PHP

Чтобы сбивать с толку спам ботов, можно периодически или регулярно менять имена полей HTML-форм. Самый простой способ - использовать функцию date() , например как date("Yz") , где «Y» - это год (2014), а «z» - порядковый номер дня в году (дни нумеруются начинается с 0). В результате date("Yz") вернет значение примерно такое «201446» (2014 год и 46-й день, т.е. 16 февраля).