Защита от спама без капчи

Защита от спам-рассылок на вашем сайте — очень важная составляющая, без которой не обходится ни один проект. Одним из эффективных способов защиты являются различные капчи, например, reCAPTCHA от Google. Но как обойтись без использования надоедливых проверочных слов или картинок?
Блокировка при AJAX-запросах
Если на вашем сайте форма обрабатывается при помощи AJAX запроса, то первое, что вы можете сделать — это запретить обращаться к PHP скрипту напрямую, без AJAX. Сделать это очень просто, добавив условие в ваш обработчик формы обратной связи:
Таким образом, мы смогли ограничить прямое обращение к файлу обработчику формы и сделали возможным только через AJAX запрос. Но что делать, если боты на вашем сайте отправляют спам через ваши формы? Для этого можно добавить дополнительные проверки.
Защита от спама с помощью ложного поля
В вашу форму можно добавить поле с именем name или email , а настоящие поля назвать иначе и скрыть его при помощи стилей:
Вот и все! Мы создали скрытое поле, которое будет видно для ботов и не видно для посетителей вашего сайта. Чем это поможет? Бот не различает видимость полей формы и заполняет поля по их именам, в нашем случае это имя или адрес электронной почты. Далее в PHP обработчике вашей формы добавляем условие на пустое поле:
Дополнительное секретное поле для защиты от спама
И еще один дополнительный метод защиты, который позволит вас ограничить отправку spam сообщений через ваши формы обратной связи. Для этого добавим 2 функции в вашу CMS систему. Если вы разрабатываете сайт на WordPress, то добавляем функции в файл functions.php вашей темы, если работаете в 1С-Битрикс, то в файл /bitrix/php_interface/init.php:
Далее добавляем скрытое поле в вашу форму обратной связи:
Таким образом мы добавляем в проверочное поле код, который состоит из случайного набора букв, точки и того же набора букв, обработанного алгоритмом md5, который шифрует в одностороннем порядке строку. Далее в php обработчике формы декодируем полученные данные при помощи функции keengoDecodeCheckWord() и проверяем верно ли передана строка:
Защита сайта от спама обратной связи
В предыдущей статье я рассказывал как защищать устаревшую джумлу и админку от перебора паролей. Но при этом многие задаются вопросом: «Почему мне приходит спам с моего сайта через установленную на моем сайте форму обратной связи?».
Убрать спам с контактной формы сайта
На этот раз я расскажу о вариантах защиты всяческих контактных форм и полей конструкторов, калькуляторов — вообщем того, что отправляет письмо администратору сайта. Мало того, что порой неинтересно читать спам или рекламу, которую прислали вместо потенциального клиента, уязвимость форм обратной связи грозит ещё баном от хостинга почтовой службы. И ваши клиенты в этот день уже не смогут отправить вам заявку.
Поэтому стоит заранее подумать о защите, а не когда заспамят по самое не хочу. Хотя в большинстве случаев владельцы сайтов думают, что сайт никому не интересен и не догадываются, что на них могут выйти боты. Другая половина считает, что лишние поля отпугивают потенциальных посетителей, а в некоторых случаях и слишком сложны для заполнения. В любом случае давайте разбирать подробнее.
Установка капчи на сайт как защита от спама
Чтобы предотвратить массовую отправку данных, следует своевременно позаботиться о защите подписных форм. Конечно, самым действенным вариантом будет установка капчи (captcha) — рисунка, текст или цифры с которого надо будет ввести в отдельное поле для подтверждения, что вы не робот. На данный момент существует огромный выбор разновидностей капчи:
— можно взять из примеров и написать или модифицировать стандартные капчи. При этом мы можем задать какие символы будут использоваться, и насколько буквы и цифры будут подвергаться всяким изменениям для ухудшения автоматического распознавания. Плюсом будет простота в распознавании людьми, такую капчу обычно ставят на сайтах с небольшой посещаемостью и где нет смысла её усложнять, то есть где атаки ботов минимальны. Минусом данного метода является то, что данный тип капчи очень быстро и легко взламывается, поэтому при большей активности спамеров следует поставить решение посложнее.
— готовые решения от Google, Yandex и других сторонних сервисов. Это не только цифро-буквенные капчи, среди них есть много интересных вариантов, таких как собрать картинку-паззл, выбрать подходящие изображения и т.п.
Recaptcha как универсальная альтернатива всем капчам
С выходом второй версии рекапчи от гугла она кардинально изменилась: сложным, длинным и неразборчивым фразам на смену пришёл поведенческий анализ. Теперь при первых попытках не надо вводить проверочных фраз — достаточно поставить галку подтверждения и проверка пройдена. При подозрительной активности Вам предложат сделать несложные действия, к примеру выбрать изображения с природой или витринами.
Удобство нового метода смогли оценить многие пользователи, поэтому многими разработчиками API рекапчи интегрировано в программный код, необходимо только получить уникальные ключи на домен.
Recaptcha 2 в Joomla
В популярной CMS джумла рекапча реализована системным плагином, поэтому стоит выбрать её в настройках, активировать плагин и ввести полученные ключи. После этого как системные компоненты могут обращаться к гуглокапче (к примеру, регистрация пользователей или стандартная контактная форма), так и различные сторонние модули и расширения (Virtuemart, сторонние контактные формы, Jcomments и другие).
Немного по другому ситуация обстоит в более старых версиях (Joomla 1.5 и 2.5). Максимум там можно найти первую капчу от гугла, но она настолько отпугивает своей сложностью, что стоит подумать или о дописывании своего варианта или решиться на миграцию на последнюю версию.
WordPress и рекапча от гугла
У вордпресса дела обстоят иначе: по умолчанию там в борьбе со спамом предлагается Akismet, который порой очень часто пропускает спам и работает не самым лучшим образом. Recaptcha существует отдельми плагинами, которые могут добавлять защитное поле в комментарии, форму авторизации или регистрации, а также в совместимости с контактной формой.
Быстрый взляд на популярные варианты к сожалению не нашел подходящего решения, удовлетворяющего всем параметрам. У всех решений были свои косяки: обнуление полей комментариев при неверном вводе капчи, необходимость проходить проверку для входа в админку, поле рекапчи находилось ниже кнопки отправить — не всегда заметно с первого раза.
Поэтому на мой взгляд вп требует допила.
Невидимая Recaptcha
Google анонсировала бета-тестирование нового типа рекапчи — Invisible reCAPTCHA. Как Вы знаете, усовершенствованная версия позволяла отличать ботов от настоящих людей на ранней стадии и предлагала реальным людям нажать простую кнопку. В то же время некоторые раскритиковали необходимость данного действия. Поэтому сейчас есть возможность опробовать новую вариацию — теперь и эту кнопку жать не надо, а рекапча будет сама анализировать момент появления на сайте. С одной стороны это облегчит жизнь пользователям, с другой стороны возможны проколы с пропуском ботов, однако это уже время покажет.
Для того, чтобы поставить новую невидимую рекапчу на сайт, необходимо получить отдельные ключи. Также необходимо реализовать функция обратного вызова (callback) для проверки легитимности. Более подробную информацию можно найти в API, и когда с ним разберусь, постараюсь выложить пример реализации на сайте.
Так как информации получилось много, то я вынес в отдельную статью — Используем невидимую рекапчу на сайте.
Рекапча на произвольном сайте
На самом деле нету ничего сложного в реализации recaptcha в любом модуле или самописной форме обратной связи. На сайте расписано подробное API как реализовать необходимую проверку. С размещением кода на фронтэнде обычно не возникает проблем, однако не все могут корректно отослать запрос проверки секретного ключа.
Поэтому я рассмотрю простой вариант back-end отправки json на php
<?php $recaptcha_secret = «XXXXXXXXXXXXXXXXXXXXXXX»; // Ваш секретный ключ
$response = file_get_contents(«https://www.google.com/recaptcha/api/siteverify?secret=».$recaptcha_secret.»&response=».$_POST[‘g-recaptcha-response’].»&remoteip success»] === true)
<
// Здесь должно происходить действие при корректном прохождении проверки
>
else
<
// Иначе выдаем какую-то ошибку
>
?>
Если понадобятся дополнительные действия с апи, то советую изучить документацию.
Защищаем форму обратной связи без капчи
Капча поможет решить нам проблему со спамом, однако многих она раздражает, и многие стараются обходиться без неё. Кроме этого, существуют различные сервисы как антигейт по обходу капчи (там люди за деньги заполняют данные с капчи). Поэтому не лишним будет рассмотреть альтернативные варианты. Для популярных CMS существуют готовые решения, в других случаях придется применить навыки программирования либо обратиться к специалистам.
Итак, я расскажу пару приемов, как повысить защищенность формы без капчи.
Скрытые поля как защита форм
Создаем hidden поля. Достаточно для заполняемых полей (name,phone, email) в стилях прописать display:none; и дополнительно создать поля с нестандартными атрибутами name (к примеру phone-protect). Обязательно надо изменить код под новые поля и добавить ещё одну проверку: если наши скрытые поля будут заполнены ( или изменены дефолтные значения), тогда будет выдавать ошибку » Спам здесь не пройдет, обнаружен бот».
Этот метод дает большой выбор пофантазировать в вариантах проверок и названий полей, а значит своей нестандартностью защититься от большего количества ботов
Используем cookies для проверки уникальность посетителя
Проверяем cookies. Тут можно создавать разнообразные варианты. При этом с помощью куков можно реализовать проверку на однократное исполнение формы ( К примеру пользователь отправил заявку, и начинает снова и снова заполнять форму обратной связи — вдруг он просто конкурент. А ему в ответ » Вы уже отправили свою заявку»).
Преимущество данного метода закрывает заодно достаточно распространенную уязвимость, на которую часто закрывают глаза, — CSRF данных формы. А ведь с помощью этой дыры можно совершать множество виртуозных атак.
Фильтрация входящих данных контактных форм обратной связи
Хорошая валидация полей на корректное заполнение является примером тоном правильного программирования. Это не только обезопасит Ваш сайт от SQL инъекций и XSS-уязвимостей, но с учетом того, что боты заполняют случайными значениями, в большинстве случаев они могут не пройти элементарной проверки на корректный телефон. Как дополнительный вариант можно устроить какую-нибудь самописную подгрузку какой-нибудь проверки на Javascript — чем больше уникальность вашего решения, тем меньше шансов пройти спаму!
Не забудьте проверить, не изменилась ли работоспособность с вашими правками. С этими советами можно защитить сайт от спама в формах обратной связи. Ну а в следующей статье я расскажу, как бороться против примитивных DDos-атак и снизить нагрузку на сервер от ботов.
Ставим надёжную защиту от спама на сайте своими силами

Замучил спам? Я написал скрипт, который защитит Ваc от ненужных писем через формы обратной связи Вашего сайта.
Раньше я пользовался reCAPTCHA от Google . Но после того, как посмотрел на его исходный код, а в частности его вес (314 Кб в несжатом виде для версии v3), а также количество инициируемых им запросов, я отказался от этой идеи и написал всё сам. Работа скрипта проверена на многих сайтах, никакого спама не прошло.
В целях безопасного сохранения всех заявок через формы связи предусмотрена запись логов.
Ниже привожу php скрипт, с подробными комментариями.
Для начала делаем форму. Среди полей формы вставляем скрытый input с логичным для понимания атрибутом name. Представим что наша форма следующего вида:
- Не нужно давать атрибуту name значение «spam» ! Роботы это увидят и не заполнят это поле.
- Не нужно прописывать атрибут style данному инпуту! Сделайте всё через CSS . Роботы увидят атрибут style и не заполнят это поле.
Форму отправляем методом POST (в теге form указываем атрибут method со значением POST).
Ниже привожу код для обработчика на php.
Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
W e b d e v e l o p m e n t b l o g !
Как предотвратить спам через форму обратной связи?
Есть сайт.
На нём 17 форм обратной связи. Все формы имеют одинаковый обработчик, за исключением небольших отличий.
С третьей формы ( Заявка на тимбилдинговую программу «Вместе мы сила» ) приходит спам — писем по 50 в день ( возможно чуть больше ).
На форме стоит маска номера : если не ввести номер, или ввести меньше нужного количества цифр — форма не отправится. Но,
спам отправляется невзирая на маску.
Письма спама, имеют такой вид :
Имена, разумеется постоянно разные ( произвольный набор цифр и букв ) и, с абсолютно разных почтовых ящиков.
Поле «телефон» — пустое ( хотя форма не должна отправлять пустое поле ).
Как можно избавится от спама ? Уже думал менять домен, но это сильно радикальный метод.
Благодарю за помощь!
- Вопрос задан более трёх лет назад
- 25362 просмотра
Простой 2 комментария
- Вконтакте



Решил проблему таким способом :
В форму добавил поле
Потом в кнопку, через которую идёт отправка, добавил
Вышло что-то вроде этого
И в php-обработчике, добавил это
Возможно кому-то поможет.
Удачи!
- Вконтакте


Alexey_R88, У вас одна форма или несколько?
Если несколько, то обратите внимание, что проверка идёт по ID, и с одной формы может всё прекрасно отправляться, а с другой выскакивать «Spam decected».
Вот доработанный вариант с более удобной проверкой по классу :


Zakonoposlushniy,
помогите, никак не могу понять, куда вставлять это:
(function() <
function handler(e) <
var elem = e.target; //e.target — нажатый элемент, в нашем случае кнопка
var parent = elem.parentElement; //родительский элемент — при такой разметке будет родительская форма
var checkInput = parent.getElementsByClassName(«check»)[0]; //вытягиваем из divа первый нужный инпут
checkInput.value = «secretcode»; //ставим нужное значение
>
var buttons = document.getElementsByClassName(«Здесь пишем класс кнопки»);
for (var i =0;i buttons[i].onclick = handler;
>
>)();
я так понял в файл с формой, но в какое место и в каких тэгах?
попробовал вставить в тэгах скрипт текст/яваскрипт внутри формы в конце и пробовал также сразу после нее, но не заработало.
и подскажите логику работы этого всего.
я правильно понял, что
1. по-умолчанию заполняю скрытое поле чек каким-то любым словом на свое усмотрение, или оставляю пустым.
2. дальше яваскрипт отслеживает нажати кнопки отправки формы и в этот момент вписывает в значение value скрытого поля кодовое слово по моему усмотрению
3. обработчик проверяет поменял ли бот слово ф скрытом поле на кодовое и если он слал через метод пост без браузера, то скорее всего не поменял и соответственно детектируем бот.
4. если же оно заполнено кодовым словом, то видимо человек постил через браузер, так как сработал наш яваскрипт по замене на кодовое слово по нажатии кнопки