Очередная анти-спам проверка без каптчи.

Очередная анти-спам проверка без каптчи. - Liber.pro - личный сайт Алексея Либера Картинка  1

Меня лично дико раздражает каптча, в особенности, когда великая и могучая гугля шесть раз подряд пытается у меня узнать как выглядят витрины и дороги, а если нужно вводить циферки написанные на тарабарском то вообще труба. Это меня как пользователя она раздражает. А как програмиста - ее не всегда корректно впишешь в дизайн. Поэтому я искал решения, которые бы отсеивали спам, но при этом не использовали каптчу.

По ути было найдено два решения:

1) Скрытое поле и проверка на пустоту, но, к сожалению, роботынаучились распознавать такие поля.

2) использовать сервис Akmist, который проверяет содержимое, но почему-то он отвалился и я так не сумел найти к нему подход.

В итоге - написал простое, но тие не менее эффективное решение, основанное на проверке проведенного времени на странице. Роботы они ведь что делают? Загружают страницу, парсят, находят форму, заполняют - отправляют. На все про все по моей личной статистике уходит не больше секунды, в то время как обычный пользователь для заполнения формы тратит как минимум секунд 30. 

Итак, от слов к делу.

 

Для eForm (evolutionCMS).

Создаем сниппет checkSpamTime, вставляем в него код:

<?php
session_start();

if ($_SESSION['now'])
{
	$_SESSION['lt'] = $_SESSION['now'];	
}
$_SESSION['now'] = microtime(true);

if (!function_exists('checkSpamTime')) 
{
	function checkSpamTime(&$fields)	
	{			
		$time = $_SESSION['now'] - $_SESSION['lt'];		
		if ($time<5) exit(); //Здесь проверяем сколько секунд прошло с момента точки входа. 5 - с запасом, можно ставить и единицу
	}
}

Далее делаем вызов сниппета над вызовом eForm (если используется несколько форм, необходимо поставить ОДИН раз над самой верхней), и в самом сниппете пишем &eFormOnBeforeMailSent=`checkSpamTime`

В итоге у нас получается что-то вроде такого:

[ !checkSpamTime! ]
[ !eForm? 
/*...*/
&eFormOnBeforeMailSent=`checkSpamTime`
/*...*/
! ]

 

Для formLister (evolutionCMS)

Создаем сниппет checkSpamTimeFL, вставляем в него код

<?php
session_start();

if ($_SESSION['now'])
{
	$_SESSION['lt'] = $_SESSION['now'];	
}
$_SESSION['now'] = microtime(true);

Сам сниппет вставляем над вызовом FL. (Внимание! Вставляем только ОДИН раз, над самым верхним).

Создаем второй checkSpamTime, вставляем:

<?php
$time = $_SESSION['now'] - $_SESSION['lt'];		
if ($time<5) exit();

И в вызов FL вставляем &prepareProcess=`checkSpamTime`

В итоге у нас получается что-то вроде такого:

[ !checkSpamTimeFL! ]
[ !FormLister? 
/*...*/
&prepareProcess=`checkSpamTime`
/*...*/
! ]

 

Для FormIt (Modx Revolution)

Аналогично тому, как и для formLister, только проверку времени вставляем не в prepareProcess, а в hooks, т.е.

[ [ !checkSpamTimeFL ] ]
[ [ !FormIt? 
/*...*/
&hooks=`checkSpamTime,email`
/*...*/
] ]

 

P.s. Не забываем в примерах удалять пробелы между скобочками 

Оставить комментарий