+

Система антиспама для форм обратной связи без капчи

26.01.2019 03:35
177

0. Такс такс… Спам на сайте? давайте-ка его убирать.

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

1. Добавляем JavaScript (с jQuery) 

Он будет добавлять скрытые поля к формам

$(function(){
 // Антиспам
 if($('.ajax_form').length)
  $.each('.ajax_form', function(){
   $(this).append('<input type="text" name="org" value="" class="_org" style="visability: hidden; height: 0; width: 0; padding: 0; border: none;" />')
  })
 // Антиспам х  
})

* где '.ajax_form' класс формы

2. Обработчик перед отправкой сообщения

Далее пишем php код который будет проверять присутствует ли поле org и пустое ли оно, если всё ок, отправляем письмо на почту

<?php
if(isset($_POST['org'])){
 if($_POST['org']!=''){
  // Поле org какогото *** заполненно
  die();
 }else{
  // Далее код для отправки сообщения
 }
}else{
 // Поле org отсутствует
 die();
}

Готово, СПАМ не пройдёт! (:

Далее код для CMS MODX


Для версии Revo с приложениями FromIt и AjaxForm

2.1. Добавляем снипет, именуем например 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{
  $modx->log(xPDO::LOG_LEVEL_ERROR, 'Форма успешно отправлена');
  $modx->log(xPDO::LOG_LEVEL_ERROR, print_r($_POST, 1));
  return true;
 }
}else{
 $modx->log(xPDO::LOG_LEVEL_ERROR, 'Ошибка заполнения формы: нет поля антиспама');
 $modx->log(xPDO::LOG_LEVEL_ERROR, print_r($_POST, 1));
 text_error();
}

Этот код будет сохранять весь спам в лог MODX и можно будет убедится что он действительно действует, кроме того даже успешные отправки будет сохранять, если вдруг с формами где то накосячили, и не пришли данные с формы, то в логе можно будет посмореть все отправленные данные

2.2. При вызове формы в чанке добавляем хук с названием этого снипета (validate)

&hooks=`validate, email, FormItSaveForm`

Для версии EVO с приложениями eForm и FormLister

2.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`