• ДОБРО ПОЖАЛОВАТЬ В КЛУБ ПО WORDPRESS

    Мы активно растущий клуб по WordPress и нам нужна помощь каждого человека, в том числе и Ваша! Не стесняйтесь и станьте частью большого сообщества.
    Мы делимся новостями, отытом и полезными советами! Пройдите простую регистрацию, чтобы пользоваться всеми возможностями нашего клуба.

    Присоединяйтесь к нам, вам обязательно понравится - Присоединится

Решено Форма регистрации с защитой от ботов

Wildcdu

ЭКСПЕРТ
Подниму тему которая до определенного времени меня мало беспокоила. (логин пароль был защищен .htaccess, двойная защита)
Как избежать регистрации ботов? Вот просто одолели до 500 регистраций в сутки дошло дело.
этот код не помогает
Код:
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} POST
    RewriteCond %{REQUEST_URI} .(wp-comments-post|wp-login)\.php*
    RewriteCond %{HTTP_REFERER} !.*s.ru.* [OR]
    RewriteCond %{HTTP_USER_AGENT} ^$
    RewriteRule (.*) - [F,L]
</ifModule>
 
Wildcdu,
капча не рулит уже? 🙁
только не слова, а математическая какая-нить
раньше еще помогало скрытые чекбоксы, и если бот там ставит отметку - то регистрация невозможна
 
нужно ставить google capcha, есть простая интеграция у них по api. полную защиту не даст, но обманывать ее просто так имхо не получится, только через проксю, а это лишние затраты, так что однозначно станет меньше
 
Честно говоря тема закрывается. Решена на двух уровнях. на уровне сервера и капчи от гугла. Поднимал исключительно из познавательных целей, хотелось элегантно решить типа одна строчка в коде ))) или что то в этом ключе. Всем Спасибо!
 
Wildcdu,
блин. да навалом способов без капчи

Метод работы: в форме создается поле, невидимое обычным пользователям, но доступное к заполнению программными средствами, которое проверяется перед отправкой сообщения. Если поле заполнено, то считаем, что письмо представляет собой спам и сразу редиректим такого пользователя на страницу с сообщением об успешной отправке, иначе передаем массив с данными отправленной формы системному макросу, который и совершит отправку письма.
Решение:
1) создадим в нашей форме специальное поле, которое будем проверять перед отправкой, допустим это будет поле с идентификатором hidden_pole и типом строка.
2) откроем шаблон по которому происходит отправка сообщения (в примере используется путь к демо-шаблону demodizzy): /templates/demodizzy/xslt/modules/webforms/add.xsl и заменем в форме путь в action на который отправляется форма с /webforms/send/ на /webforms/check/
3) создадим кастомный макрос %webforms check()% по новому формату, для этого по пути /templates/demodizzy/classes/modules/webforms/ создадим файл class.php со следующим содержимым:
Код:
<?php
    class webforms_custom extends def_module {

       public function check(){
        $post_data = getRequest('data');
        // Если скрытое поле заполнено, значит это СПАМ, сразу делаем редирект на страницу успешно отправленного сообщения
        if(!empty($post_data['new']['hidden_pole'])) {            
            $ini = cmsController::getInstance()->getModule("content");   
            $url = getRequest('ref_onsuccess');
            if (!$url) $url = $ini->pre_lang . "/webforms/posted/";
            $ini->redirect($url);
        }
        // Если скрытое поле оказалось пустым, то вызываем системный макрос send() и передаем ему массив с отправленной формой
        if ($oWebformsMdl = cmsController::getInstance()->getModule("webforms")) {
            $oWebformsMdl->send($_POST);
        }
    }

    };
?>
Здесь же создадим файл permissions.php
Код:
<?php
    $permissions = Array(
            'add'       => array('check'),
    );
?>
Всё, теперь макрос уже должен работать.
4) Не забудем отключить каптчу в настройках модуля Конфигурация.
5) Скрыть созданное поле вы можете либо средствами JavaScript либо CSS. Если использовать CSS, то удобнее всего открыть тип данных нужной формы и отредактировать добавленное специальное поле, сняв в его настройках флаг со свойства "Видимость". Поле станет невидимым и чтобы оно отправлялось наравне с другими полями формы, Вы можете явно прописать его в шаблоне, а также добавить к нему id:
<input type="text" name="data[new][hidden_pole]" id="secret" />
Теперь, по id поля мы можем его скрыть средствами CSS:
Код:
#secret {
    display: none;
}
Скрытое содержимое доступно для зарегистрированных пользователей!

Суть проста, добавлять атрибут action к форме с помощью javascript. С отключенным javascript, у формы просто не будет атрибута action, соответственно если не будет обработчика, не будет и спама.

Пример:
$(function(){$('#ad_com').attr({'action': '/savereviews'});});

Да, пользователь с отключенным javascript не сможет оставить отзыв или написать комментарий, но, не переделывать же Ferrari потому что она кому то не нравится, ведь так.


вот еще классная статья
Скрытое содержимое доступно для зарегистрированных пользователей!
 
Wildcdu,
блин. да навалом способов без капчи

Метод работы: в форме создается поле, невидимое обычным пользователям, но доступное к заполнению программными средствами, которое проверяется перед отправкой сообщения. Если поле заполнено, то считаем, что письмо представляет собой спам и сразу редиректим такого пользователя на страницу с сообщением об успешной отправке, иначе передаем массив с данными отправленной формы системному макросу, который и совершит отправку письма.
Решение:
1) создадим в нашей форме специальное поле, которое будем проверять перед отправкой, допустим это будет поле с идентификатором hidden_pole и типом строка.
2) откроем шаблон по которому происходит отправка сообщения (в примере используется путь к демо-шаблону demodizzy): /templates/demodizzy/xslt/modules/webforms/add.xsl и заменем в форме путь в action на который отправляется форма с /webforms/send/ на /webforms/check/
3) создадим кастомный макрос %webforms check()% по новому формату, для этого по пути /templates/demodizzy/classes/modules/webforms/ создадим файл class.php со следующим содержимым:
Код:
<?php
    class webforms_custom extends def_module {

       public function check(){
        $post_data = getRequest('data');
        // Если скрытое поле заполнено, значит это СПАМ, сразу делаем редирект на страницу успешно отправленного сообщения
        if(!empty($post_data['new']['hidden_pole'])) {           
            $ini = cmsController::getInstance()->getModule("content");  
            $url = getRequest('ref_onsuccess');
            if (!$url) $url = $ini->pre_lang . "/webforms/posted/";
            $ini->redirect($url);
        }
        // Если скрытое поле оказалось пустым, то вызываем системный макрос send() и передаем ему массив с отправленной формой
        if ($oWebformsMdl = cmsController::getInstance()->getModule("webforms")) {
            $oWebformsMdl->send($_POST);
        }
    }

    };
?>
Здесь же создадим файл permissions.php
Код:
<?php
    $permissions = Array(
            'add'       => array('check'),
    );
?>
Всё, теперь макрос уже должен работать.
4) Не забудем отключить каптчу в настройках модуля Конфигурация.
5) Скрыть созданное поле вы можете либо средствами JavaScript либо CSS. Если использовать CSS, то удобнее всего открыть тип данных нужной формы и отредактировать добавленное специальное поле, сняв в его настройках флаг со свойства "Видимость". Поле станет невидимым и чтобы оно отправлялось наравне с другими полями формы, Вы можете явно прописать его в шаблоне, а также добавить к нему id:
<input type="text" name="data[new][hidden_pole]" id="secret" />
Теперь, по id поля мы можем его скрыть средствами CSS:
Код:
#secret {
    display: none;
}

Суть проста, добавлять атрибут action к форме с помощью javascript. С отключенным javascript, у формы просто не будет атрибута action, соответственно если не будет обработчика, не будет и спама.

Пример:
$(function(){$('#ad_com').attr({'action': '/savereviews'});});

Да, пользователь с отключенным javascript не сможет оставить отзыв или написать комментарий, но, не переделывать же Ferrari потому что она кому то не нравится, ведь так.


вот еще классная статья



Понравилась статья с хабры про ловушку для ботов)
 
Назад
Сверху