Как избавиться от спама с FormIt, AjaxForm в MODX Revo

#разработка, #MODx, #MODx Revo, #AjaxForm
Как избавиться от спама с FormIt, AjaxForm в MODX Revo

Для тех, кто не любит вставлять для защиты от спама на сайт капчу существует альтернативное достаточно надежное решение в виде добавления скрытого поля ввода в форму. Когда его можно использовать? Изначально самым популярным плагином для форм заказа был FormIt. С популяризацией отправки заявок без перезагрузки страницы пальма первенства перешла к дополнению AjaxForm. Предлагаемое решение по запрету рассылки спама через сайт справедливо для обоих приложений MODX Revolution: как для FormIt, так и для AjaxForm.

Редактируем форму

Добавляем в структуру формы пустое поле, не hidden, скрываем его через CSS (display:none). В названии поля не используем слово spam.

<input type="text" name="site_message" value="" />

Редактируем сниппет

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

&validate=`site_message:blank`

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

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

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

Разобьем этот метод на 4 шага.

I Генерция ключа

Создаем сниппет для генерации уникального ключа и кладем его в сессию. Если значение уже хранится в сессии - просто его возвращаем.

Код сниппета getMessageKey:

if (!isset($_SESSION['spamProtectionMessageKey']) || empty($_SESSION['spamProtectionMessageKey'])){
    $_SESSION['spamProtectionMessageKey'] = time();
}
return $_SESSION['spamProtectionMessageKey'];

II Добавляем сгенерированный ключ в форму

<input type="hidden" name="message-key" value="[[!getMessageKey]]" />

III Hook для валидации

Пишем хук-сниппет chekSpamProtectionMessageKey для проверки ключа после отправки формы:

$messageKey = $hook->getValue('message-key');
if (!isset($_SESSION['spamProtectionMessageKey']) || empty($_SESSION['spamProtectionMessageKey'])
    || empty($messageKey) || (int)$messageKey !== (int)$_SESSION['spamProtectionMessageKey']){
    return false;
}
return true;

IV Добавляем хук в вызов AjaxForm

Добавляем перед хуком email, чтобы если наш хук chekSpamProtectionMessageKey вернет false (проверка не прошла), то не осущствлялась отправка формы на почту получателя.

&hooks=`spam,chekSpamProtectionMessageKey,email`

Поделиться в соцсетях:

Статьи по теме