Борьба со спамом - разные методологии

123
11 сентября 2019, 03:00

Есть вполне тривиальная форма посыла сообщений в администрацию веб-проекта. Форма выглядит следующим образом:

Капча не спасает от спама, несмотря на все усилия и ухищрения. Сделал скрипты защиты по временному интервалу, а также добавил скрытное поле, чтобы проверять роботов (они автоматически заполняют все поля, в том числе и скрытные для людей), планировал сделать скрипт выявления робота по движению курсора. Однако все эти методологии не помогли. Не знаю почему...

Код защиты формы следующий:

   //Событие отправки формы - путем нажатия submit    
   $('._iblock_add_').submit(function(e){
     var FormBegin = true; // Булевое значение 
     var Last_time = new Date(); // Последнее время
     var Interval_time =  new Date(Last_time) - new Date(Start_time);  
     console.log('делаю что хочу!');
     console.log(Interval_time); // 38426     39949
     // защитное скрытное поле против хождения робота, только робот может заполнить автоматом скрытное поле
     if ($('#user_status').val() != '') FormBegin = false;        
     // временные защиты от хождения робота, если пребывание на странице менее 5000 до отправки формы, то это робот
     if (Interval_time < 5000) FormBegin = false; 
     // идентичные данные сети - проверка ip и useragent данных. ЗАЩИТА ОТ КАКОЙ-ЛИБО ПОДМЕНЫ ДАННЫХ! 
     // Ip-адрес в начале загрузки страницы, сравнение с ip-адресом в момент отправки формы  
     console.log($('#ip_adress').val());
     console.log(IpAdress_system);
     if ($('#ip_adress').val() != IpAdress_system) FormBegin = false;
     //Защита от индивидуального спамера, который походу знает уже почту и адрес веб-проекта
     // Спамер с ником EdwardWef атаковал почту сервера
     if (($('input[name="PROPERTY[NAME][0]"]') == 'EdwardWef') || ($('input[name="PROPERTY[18][0]"]') == 'EdwardWefQO')) {
        FormBegin = false;   
     }       
     if (FormBegin == true) {
        console.log('Success data!');
        return true; //$$$      
     } else {
        console.log('Cancel data!'); 
        e.preventDefault();  //отмена события           
     }                
    });  

Однако спам все равно прорывается, и робот с ником EdwardWef побеждает в любом случае. Как победить данного робота?

Answer 1

Так у этого робота нет вашего скрипта) он просто на адрес шлет пост. Проверяйте еще на бэке полюбому. На фронте хоть вы удалите форму - этот робот будет слать спам

Answer 2

Я решал проблему так: бэкэнд при каждой загрузке формы отдает рандомно сгенерированые имена её полей, кладет их в сессию и затем ожидает именно их.

Т.е. поля формы зовут не name и email, а например df5jg и rj584.

Поле, которое не надо заполнять скрыто css-ом и рендерится в разных местах формы.

Если прилетели не те поля в POST - шлет лесом. И это вполне эффективно работает даже без капчи.

UPD: Для умных роботов, которые ассоциируют поля через label можно добавить паранойи и ставить в них svg картинки с текстом переведенным в кривые тоже с рандомными именами. Или позиционировать подписи к полям CSS-ом.

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

READ ALSO
Как задать тип для обекта, свойством которого является класс?

Как задать тип для обекта, свойством которого является класс?

Как в typeScript задать тип для обьекта, у которого есть свойство poinCreate, в котором хранится самописный js класс Point ( именно класс, а не экземляр класса)?

135
Расчет переменной в компоненте Vue.js

Расчет переменной в компоненте Vue.js

Есть скрипт, который считает переменную signal по формуле, и выводит результат в компонент bet-blockДанные для рассчетов берутся из файла json

118
Плотная компановка элементов

Плотная компановка элементов

Есть блоки расположенные так что бы занимать всё пространство блока

89