Меня лично дико раздражает каптча, в особенности, когда великая и могучая гугля шесть раз подряд пытается у меня узнать как выглядят витрины и дороги, а если нужно вводить циферки написанные на тарабарском то вообще труба. Это меня как пользователя она раздражает. А как программиста — ее не всегда корректно впишешь в дизайн. Поэтому я искал решения, которые бы отсеивали спам, но при этом не использовали каптчу.
По ути было найдено два решения:
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. Не забываем в примерах удалять пробелы между скобочками
Оставить комментарий
только без мата, пожалуйста)