Простая защита от спама на своём сайте

Опубликовано 13.12.2023

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

Можно использовать стандартные плагины для cms, но боты легко выявляют это и умеют обходить защиту. Капча — второй вариант, но заполнять её никто не любит, особенно ваш клиент. Поэтому я предлагаю третий вариант.

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

Спам

В своей форме добавляем какое-нибудь стандартное поле, которое бот обязательно захочет заполнить, например email или phone. А потом через js заносим ключ, который мы будем сверять в скрипте на сервере, обрабатывающей форму. Разумеется для пользователя надо его скрыть через css. В скрипте если пришёл ключ, который мы задали, то это скорей всего пользователь, если не пришёл или пришло другое значение, то это бот.

Важно, чтобы реакция формы была аналогичной реакции на реальную отправку пользователем. Например, вывод сообщения о том, что форма отправлена, или перенаправление на страницу /success, чтобы бот ни о чём не догадался.


Задаём ключ для скрытого поля (в примере я использую JQuery):

$('#email').val('XXXXXXXXXXXXX');

В скрипте, принимающей форму, сверяем ключ:

if($email == 'XXXXXXXXXXXXX'){
  //Ключ совпадает, сохраняем заявку
}else{
  //Неверный ключ, не сохраняем
}

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

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

О том, как организовать отправку писем я написал в статье Правильная отправка email-писем на своём сайте.

А как вы боретесь со спамом? Поделитесь опытом в комментариях к посту или в группе в телеграм.

Возникли вопросы?
Обсудим в группе: