Как защитить форму от спама
Перейти к содержимому

Как защитить форму от спама

  • автор:

Как защитить форму на сайте от спама

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

Защита с помощью CAPTCHA

Самая распространенная защита форм от спама — это капча (captcha). Капчей называется одна из разновидностей теста Тьюринга, который предназначен для различения людей и роботов. Вы не раз сталкивались с ней при регистрации на различных ресурсах. Вспомните, как вас просили ввести буквы/цифры с искаженных картинок или отметить фотографии, на которых присутствуют пожарные гидранты. Это и есть captcha.

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

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

Бесплатные капча-сервисы: примеры

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

Вы можете воспользоваться специальными сервисами, которые предоставляют готовые варианты таких мини-тестов. Например:

  1. reCAPTCHA от Google . Можно использовать вторую версию (галочка «Я не робот») или третью, «невидимую», которая проводит незаметную проверку на основе поведения посетителя.
  2. hCAPTCHA . Бесплатный сервис, можно подключить к ВордПрессу, интегрировать с PHP, внедрить в Android-приложение.
  3. Akismet и другие плагины для WordPress.

Защита формы от спам-ботов без капчи

  1. Рамки на время заполнения формы.
  2. Скрытое поле.
  3. Блокировка user-agent.
  4. Cookies для проверки уникальности посетителя.
  5. Фильтрация входящих данных.

Ниже мы подробнее расскажем о каждом способе защиты.

№1. Рамки на время заполнения формы

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

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

№2. Скрытое поле

Как правило, роботы не выбирают, какие из полей в форме заполнять, а какие нет. Они автоматически вводят данные во все, чтобы не пропустить чек-боксы вроде «Я принимаю…». На этом и строится защита с помощью hidden-полей.

Алгоритм следующий: помимо стандартных «name», «email» нужно добавить дополнительное поле, например, «phone», и сделать его невидимым для пользователей. Для этого ему через стили присваивается атрибут display:none (он не принципиален, можно скрыть и другим способом, если умеете). В итоге обратная связь поступает в двух видах: реальная через открытые поля и спам через hidden. Пропишите условие, что делать с информацией во втором случае: например, вывести на страницу ошибку или, наоборот, сделать вид, что форма отправлена, но не принимать ее, чтобы запутать бота. Таким способом можно вполне успешно защищать сайт от мусорных спам-запросов. Правда, многие боты будут пытаться отправить данные во всех возможных вариантах, тогда потребуются другие инструменты противодействия.

№3. Блокировка user-agent

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

№4. Cookies для проверки уникальности посетителя

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

№5. Фильтрация входящих данных

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

Заключение

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

Похожие статьи

Как защитить сайт от копирования текста

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

Как оформить страницу 404: примеры дизайнов

В процессе интернет-серфинга мы часто сталкиваемся с ошибкой 404 (Error 404 Not Found). Этот код означает, что на сайте нет страницы с таким адресом. Проблема может возникнуть по нескольким причинам: пользователь ввел неверный URL, информация была перемещена на другой веб-адрес, страницу удалили, произошел сбой на сервере. Чем крупнее ресурс и чем больше на нем веб-страниц, тем сложнее уследить за корректностью ссылок внутри него. Посетители натыкаются на ответ 404 и спешно покидают сайт, не найдя того, что искали. Это плохо влияет на показатели SEO. Избавиться от этой ошибки нельзя, но можно оформить ее так, чтобы она работала на вас. В статье мы расскажем, зачем и как это делают разные веб-проекты.

Как исправить ошибку «Ваше подключение не защищено»

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

Нажмите дважды, чтобы увеличить

Как защитить форму от спама

Атакующему выгодна возможность выполнить максимальное количество запросов за минимальное время с одного устройства. Повторный запрос кода подтверждения с одного IP адреса или на один номер следует разрешать не ранее, чем через 90-120 секунд. А лучше — увеличивать это время с каждым повторным запросом. Эту проверку следует осуществлять не только в интерфейсе браузера, но и на серверной стороне.

 $ip = $_SERVER['REMOTE_ADDR']; $phone = $_POST['phone']; $isLimited = apcu_fetch($ip) || apcu_fetch($phone); apcu_store($ip, 1, 90); apcu_store($phone, 1, 90); if ($isLimited) < // deny >

Как улучшить: использовать browser fingerprinting [1] [2] и exponential backoff [1] [2].

2. Ограничение количества запросов с одного IP

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

Стоимость аренды 1 IPv4 адреса ~100₽, а отправки SMS — ~4₽, что делает невыгодным атаку при

 $ip = $_SERVER['REMOTE_ADDR']; $hits = apcu_fetch($ip) ? apcu_inc($ip) : intval(apcu_store($ip, 1, 86400)); if ($hits > 5) < // deny >

Как улучшить: автоматически добавлять IP-адреса в запрещенные на уровне фаервола или веб-сервера [1] [2] [3] [4]. В примитивном варианте это может выглядеть так:

 if ($hits > 5) < @fwrite(fopen('/var/log/spam.log', 'a'), "deny $ip;\n"); >// nginx.conf: server < include /var/log/spam.log; allow all; // crontab: */5 * * * * /etc/init.d/nginx reload 

3. Ограничение количества запросов на один номер

При отправке сообщения через api.greensms.ru повторный запрос идёт альтернативным маршрутом, чтобы гарантировать доставку. Последующее сообщения будут направлены теми же маршрутами, потому, если предположить, что они по каким-то причинам не были получены — дальнейшие повторы нецелесообразны.

Пример ограничения для 5 запросов на один номер в сутки:

 $phone = $_POST['phone']; $hits = apcu_fetch($phone) ? apcu_inc($phone) : intval(apcu_store($phone, 1, 86400)); if ($hits > 5) < // deny >

Как улучшить: начиная с 3-го запроса использовать код в номере, входящий звонок, код голосом, VK, WhatsApp, Viber вместо SMS; запретить отправку в страны, в которых нет ваших пользователей.

4. Использование CSRF-токена

Наличие в форме уникального одноразового токена и его проверка на серверной стороне немного усложняет задачу атакующему, поскольку гарантируют, что запрос отправлен лишь после предварительной загрузки формы. Детали примере Laravel можно почерпнуть из документации.

Как улучшить: проверять, отправлен ли запрос посредством AJAX [1], использовать SameSite Cookie [1]

5. Использование Google reCAPTCHA v3

reCAPTCHA v3 является “скрытой” формой проверки, не требующей со стороны пользователя решения задач или ввода текста. В результате работы сервис возвращает значение в диапазоне от 0 до 1, означающее вероятность того, что пользователь — человек.

На практике, значения от 0,3 могут присваиваться легитимным пользователям, потому для полноценной фильтрации могут быть использованы лишь значения

Помимо этого, поскольку метод использует browser fingerprinting — наблюдаются ботнеты, способные стабильно показывать результат в 0,9. Всплеск активности на скриншоте — нелегитимный трафик с оценкой 0,9.

Как улучшить: дополнить отображением reCAPTCHA v2 в сомнительных случаях, например при оценке в диапазоне 0,3-0,7 или повторных действиях.

6. Блокировка нежелательного трафика

Если вы не ведете бизнес в каких-либо регионах, вы можете ограничить для них доступ или блокировать отправку на соответствующие номера.
Можно ограничить доступ для известных ботов и инструментов разработки на основе заголовков User-Agent и Referer.

Как улучшить: блокировать IP адреса дата-центров и хостинг-провайдеров.

7. Сервисы фильтрации трафика

Cloudflare, Qrator, DDoS-Guard предлагают не только решения по защите от DDoS, но и от ботов. Но и это не панацея.

Защита формы от спама

Как можно защитить форму от спама, без капачи. Пока идея при заходе юзера на страницу делать md5 ип+браузер, потом записывать в скрытое поле, и проверять при субмите + проверять рефу и ип. Какие еще идеи? UPDATE

// вызов перед передачей данных function showRequest(formData, jqForm, options) < // formData - массив; здесь используется $.param чтобы преобразовать его в строку для вывода в alert(), // (только в демонстрационных целях), но в самом плагине jQuery Form это совершается автоматически. //var queryString = $.param(formData); // jqForm это jQuery объект, содержащий элементы формы. // Для доступа к элементам формы используйте // var formElement = jqForm[0]; //alert('Вот что мы передаем: \n\n' + queryString); // здесь можно вернуть false чтобы запретить отправку формы; // любое отличное от fals значение разрешит отправку формы. return true; >

как сюда добавить изменение переменой перед отправкой?
Отслеживать
задан 11 сен 2011 в 19:01
82 1 1 золотой знак 2 2 серебряных знака 16 16 бронзовых знаков

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Только капча! Никакие скрытые поля. Их скриптом спокойно можно взять, как и любые куки. Так что только капча! И задержка на определенное количество минут с записью ИП + время в базу.

Отслеживать
51.4k 87 87 золотых знаков 267 267 серебряных знаков 508 508 бронзовых знаков
ответ дан 11 сен 2011 в 19:04
1,674 9 9 серебряных знаков 8 8 бронзовых знаков

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

11 сен 2011 в 19:13

Есть такие сервисы. И цены там действительно копеечные. Так что капча уже не слишком действенный метод.

11 сен 2011 в 19:19

Сделайте в одной капче разные наклоны и перевороты, например. Я вообще делал числа с поворотами и знак арифметический между ними. Надо просто решить пример. Само собой панацеи никогда не будет, но капча+задержка по времени хотя бы по ИП более действенна.

11 сен 2011 в 19:24
Ну и гадай, что там на этой капаче нарисовано. человек развернется и уйдет быстрей.
11 сен 2011 в 19:29
зачем гадать то. рядом инструкция. на капче числа не большие так что даже второклашка решит пример
11 сен 2011 в 19:31

Можно вместо графической капчи взять большой словарь вопросов:

  • Кто президент России?
  • В каком году началась Отечественная война?
  • Кто был первым космонавтом в мире?

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

Отслеживать
ответ дан 11 сен 2011 в 19:16
34.5k 27 27 золотых знаков 98 98 серебряных знаков 214 214 бронзовых знаков

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

11 сен 2011 в 19:21

Только не пойму, как это прикрутить. Вот есть у таблица словарь. мы берем с поля вытаскиваем пример, выводим. А потом, что с чем сравниваем? Как передать ид строки, с чем сравнить ответ?

11 сен 2011 в 19:22

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

11 сен 2011 в 19:26

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

Отслеживать
ответ дан 11 сен 2011 в 19:05
86 2 2 бронзовых знака

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

11 сен 2011 в 19:08

Форма все равно отправляется через аякс. А как можно менять и на что? У меня есть функция, которою можно вызвать перед отправкой данных.

11 сен 2011 в 19:11

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

11 сен 2011 в 19:20

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

11 сен 2011 в 19:26

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

11 сен 2011 в 19:27

Мб предложение детское, но если подумать - чем принципиально отличается человек от бота?

Для капчи - он видит текст на картинке.

Для изменения полей - он не видит то, что спрятано через css.

Еще такой вариант - человек не пишет мгновенно. То есть можно заморочиться по этому поводу. Скорость печати для секретаря-выпускника - 180 знаков/мин, 3 знака/сек. Что делаем:

Файл с формой (если каждой форме сделать ID - прбиваемость еще снизится, беру этот вариант)

 3 символов, который ~90% печатал человек. Можно скомбинировать с капчей и прибавить еще 5 сек на ее ввод. > > // если на форму еще не заходили - игнорируем POST вообще $_SESSION['FORMS']['comment'] = time(); ?>  
Имя:
Сообщение:

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

Как защитить форму от спама

Тема защиты форм от спам-ботов будет актуальной, наверное, всегда. Самым популярным инструментом на сегодня, пожалуй, является ReCAPTCHA от Google. Однако с ней есть некоторые сложности.

В данный момент ReCAPTCHA представлена в двух версиях: v2 (с кнопкой "Я не робот") и v3 (невидимая). Проблема версии с кнопкой состоит в том, что спамеры научились ее обходить. А проблема 3-й версии — в том, что, как ее ни настраивай, она может не пропустить заполненную форму от живого пользователя. В нашей практике не раз были случаи, когда заказчики жаловались на то, что их клиенты не могут отправить какую-нибудь форму на сайте из-за того, что ReCAPTCHA 3-й версии считала их активность подозрительной. Поэтому мы стараемся не прибегать к этому инструменту без особой необходимости.

Для замены рекапчи мы применяем свое достаточно простое решение. Разберем на конкретном примере.

Дано: форма обратной связи с полями:

  • Имя
  • Телефон
  • Email
  • Комментарий
  • Согласие на обработку персональных данных
  • Все поля, кроме "Комментарий", обязательные.

Чтобы роботы не могли отправить такую форму, нужно добавить в нее фейковое поле, которое будет видно только им. Это поле будет присутствовать в HTML-разметке страницы, но не будет видно обычному посетителю. Если данное поле отправляется на сервер заполненным, сервер такую форму не должен принимать. Уловка в том, что большинство ботов заполняют все поля без разбора, поэтому данный метод сработает в большинстве случаев.

Чтобы максимально усложнить выявление роботами такого поля, оно должно максимально походить на настоящее, поэтому рекомендуется соблюдать ряд условий:

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

Для скрытия дублирующего поля нужно добавлять дополнительный класс, название которого никак не должно намекать на то, что поле скрыто. По этому классу в CSS должно быть прописано свойство visibility: hidden. Не рекомендуется добавлять это свойство в inline-стилях.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *