RealAdmin.ru

RealCaptcha — простая каптча для MODX Revolution

MODX,Комментарии,Почта
Категория: Сайтострой
24 нояб. 2013 г.

Любую форму обратной связи важно защитить от спама. Если в MODX Evolution была встроенная аккуратная каптча, то в Revolution от неё отказались и предложили в качестве альтернативы ReCaptcha от Google, которая искажает символы так, что с первой попытки угадать их бывает крайне сложно.

Поискав информацию на тему альтернативной каптчи для MODX Revo я обнаружил что выбор мал. Есть готовый компонент «Qaptcha», основанный на jquery плагине и пару статей на тему, как сделать каптчу для MODX самому. Поэтому я решил написать свой вариант простой каптчи для MODX Revo. Каптчу я назвал «RealCaptcha» и на её основе собрал пакет для MODX Revolution. Это мой первый опыт сборки пакетов, поэтому возможны баги.

Скачать «RealCaptcha» 1.0.4

Для установки пакета скопируйте его в директорию /core/packages/, а затем в «Система -> Управление пакетами», нажмите «Искать пакеты локально».

Пакет состоит из одного чанка и сниппета

Чанк выводит каптчу и поле для ввода символов с неё:

[[$RealCaptcha]]

Сниппет производит проверку правильности введенных символов с каптчи. Если они совпадают, то возвращает «true», если нет — «false»:

[[!RealCaptchaValid]]

Изображение каптчи генерируется скриптом «kcaptcha», который распаковывается по умолчанию в директорию:/assets/components/realcaptcha/kcaptcha/. Там лежит конфигурационный файл, изменяя параметры которого, Вы можете добиться нужного уровня искажения изображения каптчи.

Привязка RealCaptcha к FormIt

Исходим из того, что форма обратной связи у вас уже настроена и работает. В таком случае для привязки каптчи внутри формы обратной связи пропишите чанк «[[$RealCaptcha]]» (где-нибудь перед кнопкой Отправки), а в вызове сниппета «FormIt» пропишите дополнительные параметры - «validate» и «customValidators». Вот как это выглядит у меня:

[[!FormIt?
      &hooks=`email`
      &emailTpl=`MyLetterChunk`
      &emailTo=`exemple@mail.ru`
      &successMessage=`Письмо успешно отправлено.`
      &emailSubject=`Обратная связь exemple.ru`
      &validate=`captcha:RealCaptchaValid, name:required, email:email:required`
      &customValidators=`RealCaptchaValid`
]] 

Конечный результат будет выглядеть примерно так:

каптча для modx

Чтобы при неправильно введенных символах выводилась ошибка, в форме или перед ней прописываем плейсхолдер:

[[!+fi.error.captcha]]

Простая каптча для формы обратной связи готова.

Привязка RealCaptcha к Quip

Теперь рассмотрим каким образом можно привязать «RealCaptcha» к комментариям «Quip».

Сначала давайте выведем нашу каптчу на форме отправки нового сообщения. За генерацию этой формы отвечает сниппет «QuipReply», а за оформление — чанк, который указывается в качестве параметра — «&tplAddComment»:

[[!QuipReply?
      &thread=`[[*alias]]-[[*id]]`
      &moderate=`0`
      &tplAddComment=`comment-chank`
]]

В этом чанке перед кнопкой «Отправить», вызываем чанк, отвечающий за вывод каптчи, а так же код, который будет выводить ошибку в случае неверно введенных символов:

<span class="quip-error">[[+error.RealCaptcha]]</span> 
[[$RealCaptcha]]

Осталось дело за малым - вызвать в коде компонента «Quip» наш сниппет проверки правильности введенной каптчи. Для этого открываем файл /core/components/quip/controllers/web/ThreadReply.php и в функцию «handlePost()» прописываем следующий код:

/* RealCaptcha */
$fields['captcha'] = strip_tags($fields['captcha']);
$validate = $this->modx->runSnippet('RealCaptchaValid',array('component' => 'Quip','QuipValue' => $fields['captcha']));
if ($validate!='RealCaptchaTrue') $errors['RealCaptcha'] = 'Ошибка. Каптча введена неверно!';

RealCaptcha

В коде мы вызываем сниппет «RealCaptchaValid» с параметром «component=Quip» и при отрицательном результате проверки каптчи генерируем ошибку. Теперь всё должно работать.

В завершение хочется поблагодарить человека с ником Anovoselof, который описал способ привязки своей каптчи к комментариям в MODX Revolution. Я всего лишь оформил всё это в качестве пакета и упростил использование.

Посмотрите похожее — 6
Комментарии —
  1. Ромчик07 августа 2015, 22:55#
    После переноса сайта на др. хостинг, капча не принимает введенный код, обновление сниппета не дало результата. В чем может быть проблема?
    1. Simkin Andrew08 августа 2015, 12:43#
      Открой файл assets/components/realcaptcha/kcaptcha/index.php и проверь правильность путей. Я там их несколько коряво прописал. Логично заменить:
      ../../../../core/model/modx/modx.class.php
      на $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php
      и include('kcaptcha.php');
      на $_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php

      Если не поможет, значит на новом хостинге как-то не так работают сессии.
      Возможно, следует проверять их работу и выяснять у тех. поддержке почему они не работают. Ещё могу дать другой код для подключения в этом же файле ядра модх, но по идее раз работало, то ничего случится не должно было.
      1. Ромчик08 августа 2015, 15:12(был изменён)#
        Спасибо за помощь!

        Если детально, сделал так:

        <?php
        
        require_once $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php";
        $modx= new modX();
        $modx->initialize('web');
        error_reporting (E_ALL);
        
        $_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php";
        
        $captcha = new KCAPTCHA();
        
        session_start();
        
        if($_REQUEST[session_name()]){
            $_SESSION['RealCaptcha'] = md5('realadmin.ru'.$captcha->getKeyString().'realadmin.ru');
        }
        
        ?>
        
        В таком случае не загружается даже картинка каптчи в форме, пустой img. Может полностью попробовать путь прописать
        http://...
        ?
      2. Simkin Andrew08 августа 2015, 12:45#
        define('MODX_API_MODE', true);
        require $_SERVER['DOCUMENT_ROOT'].'/index.php';
        $modx->initialize('web');
        
        1. Ромчик08 августа 2015, 15:54#
          define('MODX_API_MODE', true);
          require $_SERVER['DOCUMENT_ROOT'].'/index.php';
          $modx->initialize('web');
          Тоже не исправило (Ошибка, каптча введена неверно!). Я уже по этому случаю поверх установил Modx. Все работает, кроме каптчи ( Наверное проблема с новым хостом. В любом случае, большое спасибо за помощь!
          1. Ромчик08 августа 2015, 16:32#
            Обратился в ТП хостинга, просят уточнить какие требования к хостингу со стороны CMS.
            1. Simkin Andrew09 августа 2015, 13:54#
              Не знаю, что-то с сессиями наверно связано. Надо дебагером проверять, если сессии с именем RealCaptcha нет, значит по каким-то причинам она не создалась в файле assets/components/realcaptcha/kcaptcha/index.php

              Либо косяк действительно на хостинге, либо API MODX не подключился как надо, чтобы нормально работать с сессиями.

              А еще можно сессии отключать — параметр session_enabled для контекста. Может отключены просто.
              1. Ромчик10 августа 2015, 00:24#
                Пробовал экспериментировать с session_enabled, когда отключаю сайт вообще не загружается.

                Все сдаюсь… :) Буду пока без каптчи.

                Альтернативных вариантов не так много. Яндекс прекратил поддержку.

                1. Любовь14 октября 2015, 10:55#
                  Я нашла вот такое решение
                  Тут в сниппете:
                  session_start();
                  //Создаем строку из 8 случайных цифр. 
                  for($i=1; $i<=8; $i++)
                  {$r=rand(0, 9);
                  $rnd.=$r; $rndn.=$r;
                  if ($i==4){$rndn.=' ';}}
                  // Записываем их в сессию
                  $_SESSION['captcha']=$rnd;
                  // Переменную с пробелом выводим на картинку с помощью phpthumbof
                  return '<img title="Введите номер карты" src="[[*capimg:phpthumbof=`w=140&h=90&zc=1&fltr[]=wmt|'.$rndn.'|10|BL|000000|10|90|15|0|5|15|`]]" alt="Каптча">';

                  есть вывод картинки, но она у меня не отображается, а цифры если написать echo $_SESSION['captcha']; выводит. Может посмотрите и мне заодно подскажете? :)
                  1. Simkin Andrew14 октября 2015, 14:00#
                    А что, тоже не работает RealCapcha? Ну если в сессии сохраняется всё, значит неправильно отрабатывает сниппет проверки. Я могу помочь только если доступы от админки мне дашь.
                  2. Ивано-Иванко15 сентября 2016, 16:14#
                    вот так у меня все заработало
                    <?php
                    
                    require_once $_SERVER['DOCUMENT_ROOT']. "/core/model/modx/modx.class.php";
                    define('MODX_API_MODE', true);
                    require $_SERVER['DOCUMENT_ROOT'].'/index.php';
                    //$modx->initialize('web');
                    //$modx= new modX();
                    //$modx->initialize('web');
                    //error_reporting (E_ALL);
                    
                    include($_SERVER['DOCUMENT_ROOT']. "/assets/components/realcaptcha/kcaptcha/kcaptcha.php");
                    
                    $captcha = new KCAPTCHA();
                    
                    //session_start();
                    
                    //if($_REQUEST[session_name()]){
                        $_SESSION['RealCaptcha'] = md5('realadmin.ru'.$captcha->getKeyString().'realadmin.ru');
                    //}
                    
                    ?>
                    1. Simkin Andrew15 сентября 2016, 17:02#
                      Пасиб… как нибудь обновлю пакет
          2. Ромчик08 августа 2015, 00:42#
            Спасибо кстати огромное за компонент, очень нравился простотой и легкостью чтения символов.
            1. roman24 декабря 2015, 11:56(был изменён)#
              В чанке [[$RealCaptcha]] ошибка при подключении картинки: img border=«1px» src="/assets/components/realcaptcha/kcaptcha/index.php". Нужно указать полный путь: [[++site_url]]assets/components/realcaptcha/kcaptcha/index.php, чтоб получилось найти index.php.
              1. Simkin Andrew24 декабря 2015, 21:32#
                ок, спасибо… поправим
              2. Владимир07 марта 2017, 11:56#
                Подскажите, а как можно добавить кнопку «Обновить картинку» рядом с капчей, а то получается что если неправильно ввел символы, нужно закрывать popup и открывать его снова (кнопка «Сделать заявку» на сайте). Спасибо.
                1. Simkin Andrew09 марта 2017, 20:12#
                  К сожалению, Ajax не поддерживает. Если используете FormIt и AjaxForm, лучше поискать другие методы защиты от спама, например, скрытое поле, которое с помощью hook параметра FormIt проверять на корректность значения. Типа изначально пишем туда Hello spam! и если при отправке формы это значение уже другое, то определяем бота и запрещаем отправку формы.
                2. Vasler13 апреля 2017, 21:15#
                  Не работает. Вечно говорит что капча введена не верно. Почему??
                  1. Simkin Andrew13 апреля 2017, 21:37#
                    Файл assets/components/realcaptcha/kcaptcha/index.php попробуй отредактировать как писали в комментарии http://realadmin.ru/saytostroy/realcaptcha-for-modx.html#comment-991
                    1. Vasler13 апреля 2017, 21:42#
                      О, точно, так заработало. Спасибо. Так обнови пакет, братишка)) Modx итак нищебродская система на номральне модули. Если во всяких шлаковых джумлах их моря, то тут по блогам надо выискивать элементарную капчу. Хороший же модуль, дай ему жить)
                  © REALADMIN.RU   2019 г.
                  Страница сгенерирована: 0,1428 s | 4 mb.
                  На каком уровне Вы играете в шахматы?
                  О П Р О С
                  Home Question Top