0. Такс такс… Спам на сайте? давайте-ка его убирать.
Данный метод прокатит практически в любом случае, логика проста, спам-боты заполняют все поля форм, и за частую отключат js, по этому добавляем с помощью js в форму поле, если это поле будет отсутствовать или будет заполнено, форма не отправиться
1. Добавляем JavaScript (с jQuery)
$(function(){
// Антиспам
$('.ajax_form').append('<input type="text" name="org" value="" class="_org" style="visability:hidden; height: 0; width: 0; padding: 0; border:none;"/>')
// Антиспам х
})
* где '.ajax_form' класс формы
Для версии Revo с приложениями FromIt и AjaxForm
2. Добавляем снипет, именуем например validate
<?php
function text_error(){
return false;
die();
}
if(isset($_POST['org'])){
if($hook->getValue('org')!=''){
$modx->log(xPDO::LOG_LEVEL_ERROR, 'Ошибка заполнения формы: не пустое поле антиспама');
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($_POST, 1));
text_error();
}else{
return true;
}
}else{
$modx->log(xPDO::LOG_LEVEL_ERROR, 'Ошибка заполнения формы: нет поля антиспама');
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($_POST, 1));
text_error();
}
3. При вызове формы в чанке добавляем хук с названием этого снипета (validate)
&hooks=`validate, email, FormItSaveForm`
Для версии EVO с приложениями eForm и FormLister
2. Добавляем снипет «validate»
<?php
function validate(){
if(isset($_POST['org'])){
if($_POST['org']!=''){
die();
}else{
}
}else{
die();
}
}
Перед выводом формы выводим снипет
[!validate!]
Если используете FormLister
В выводе FormLister добавляем
[!FormLister?
&prepareProcess=`validate`
Для чистого eForm
[!eForm?
&eFormOnValidate=`validate`
Готово, Всем спасибо, расходимся...
PS: Помог? Ставь лайк! Подписка не нужна (:
Artem Surkov 25.12.2017 01:46 #
Как правило спамеры пытаются отправить какую то ссылку. А реальные пользователи, как правило, просто задают вопрос, типа как купить, сколько стоит и т.д. Поэтому первое — запрещаем ввод ссылок. Так же в сниппете предусмотрена проверка поля ввода телефона.
Подключать сниппет в formIt в виде кастомного валидатора &customValidators=`antispam`. Ну и прописывать валидацию к нужным полям. Как правило, это поле message: &validate=`message:antispam`
Код сниппета antispam:
Artem Surkov 25.12.2017 01:48 #
Ильин Сергей 25.12.2017 22:24 #
Artem Surkov 25.12.2017 23:18 #
Пользователям, на тех сайтах, с которыми работал никогда не требовалось отправлять ссылку. А вот количество спама уменьшилось до 1- 2 штук в месяц против 10-20 в месяц, т.е в 10 раз. Но это лишь частный случай.
И к тому же запись в лог предназначена как раз для такого случая — отслеживать, а не пытается ли добросовестный пользователь отправить ссылку безуспешно. Поверьте, за все время не было ни одного случая. Еще в лог пишется IP адрес, как вы заметили. Бывает, что один IP-шник мозолит глаз с завидной регулярностью. Сами понимаете, что с ним можно сделать. На кол! :-)
Вообще можно усложнить алгоритм проверки. Намекаю на разработку полноценного дополнения к formit ;-)
DOM 22.02.2018 17:50 #
1. Создать поле в начале формы
2. Скрыть поле в файле css
3. Добавить поле валидации в вызов AjaxForm