Есть вполне тривиальная форма посыла сообщений в администрацию веб-проекта. Форма выглядит следующим образом:
Капча не спасает от спама, несмотря на все усилия и ухищрения. Сделал скрипты защиты по временному интервалу, а также добавил скрытное поле, чтобы проверять роботов (они автоматически заполняют все поля, в том числе и скрытные для людей), планировал сделать скрипт выявления робота по движению курсора. Однако все эти методологии не помогли. Не знаю почему...
Код защиты формы следующий:
//Событие отправки формы - путем нажатия 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 побеждает в любом случае. Как победить данного робота?
Так у этого робота нет вашего скрипта) он просто на адрес шлет пост. Проверяйте еще на бэке полюбому. На фронте хоть вы удалите форму - этот робот будет слать спам
Я решал проблему так: бэкэнд при каждой загрузке формы отдает рандомно сгенерированые имена её полей, кладет их в сессию и затем ожидает именно их.
Т.е. поля формы зовут не name и email, а например df5jg и rj584.
Поле, которое не надо заполнять скрыто css-ом и рендерится в разных местах формы.
Если прилетели не те поля в POST - шлет лесом. И это вполне эффективно работает даже без капчи.
UPD: Для умных роботов, которые ассоциируют поля через label можно добавить паранойи и ставить в них svg картинки с текстом переведенным в кривые тоже с рандомными именами. Или позиционировать подписи к полям CSS-ом.
Но да конечно это все не поможет, если робот шлет напрямую в целевую почту по email. Поменяйте её на что-нибудь трудновыговариваемое и никому не показывайте.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как в typeScript задать тип для обьекта, у которого есть свойство poinCreate, в котором хранится самописный js класс Point ( именно класс, а не экземляр класса)?
Есть скрипт, который считает переменную signal по формуле, и выводит результат в компонент bet-blockДанные для рассчетов берутся из файла json
Есть блоки расположенные так что бы занимать всё пространство блока