Приложите бриф или ТЗ

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

АнтиСпам на FormIt и AjaxForm

И так АнтиСпам на FormIt и AjaxForm.. Пока мы решаем проблему спама следующими способами:

1. Пустое поле

Защита с помощью проверки на пустоту скрытого поля, которое обычно спамботы заполняют. К сожалению, многие роботы научились распознавать такие поля, но в целом поток спама уменьшается. Добавляем в структуру формы пустое поле, не hidden, скрытое через CSS: <input type="text" name="my-message" class="my-message" value="" />

Теперь в вызов сниппета добавляем проверку, что вставленное скрытое поле пусто.

&validate=`my-message:blank`

И не забудем скрыть поле через CSS.

.my-message { display:none; }

2. Проверка загрузки страницы и клика по нужным кнопкам

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

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

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

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

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

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

Пишем 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;

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

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

&hooks=`spam,chekSpamProtectionMessageKey,email`

ГОТОВО!

3. Проверка наличия ссылок и email в поле сообщений.

Данный способ заключается в том, что бы запретить ввод ссылок, которые в основном пытаются отправить ссылку на какой-нибудь сайт или телефон. Настоящие пользователи обычно задают какой-нибудь вопрос. И так, создаем сниппет (назовем его antispam), в котором проверяем ввода телефона и email.

<?php
/*Сниппет, проверяющий содержание формы на признаки спама*/
//Определяем значения служебных переменных по умолчанию
$success=true;
$haserror=false;
//Массив запрещенных фрагментов строк
//Если в каком либо поле формы встретится один из ниже перечисленных фрагментов, то далее обрабатывать сообщение не будем
$forb=array(
'@',
'http',
'://',
'www'
);

//Пробегаем по массиву запрещенных фрагментов
foreach ($forb as $f){
 if($haserror==false){ //Если еще не встретился запрещенный фрагмент
 $haserror=strpos($value,$f); //Проверяем его в значении текущего проверяемого поля ввода
 }
}

/*Проверка телефона (если не нужна, просто закомментируйте строки 22-25)*/
if(substr_count($key,'phone')>0){ //Если проверке подвергается поле ввода телефона
 if($value!='' and strlen($value)<16){$haserror=1;} //для поля ввода телефона проверяем длину введенного значения (при использовании скрипта форматирования это будет строка из 16 символов всегда!)
}

//Если была обнаружена ошибка
if ($haserror!=false) {
 $validator->addError($key,'Недопустимое значение!');
 $modx->log(xPDO::LOG_LEVEL_ERROR,'Антиспам: IP='.$_SERVER['REMOTE_ADDR'].' СОДЕРЖАНИЕ '.$key.': '.$value);
 $success=false;
}
//Возвращаем результат работы валидатора
return $success;
>

Далее подключаем сниппет в formIt и прописывать валидацию к нужным полям:

&customValidators=`antispam`
&validate=`message:antispam`

ГОТОВО!

Думаю, есть смысл использовать всё и сразу)