RealAdmin.ru

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

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

Любую форму обратной связи важно защитить от спама. Если в 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
Комментарии — 20
  1. avatar Vasler 13 апреля 2017, 21:15 #
    Не работает. Вечно говорит что капча введена не верно. Почему??
    1. avatar Simkin Andrew 13 апреля 2017, 21:37 #
      Файл assets/components/realcaptcha/kcaptcha/index.php попробуй отредактировать как писали в комментарии http://realadmin.ru/saytostroy/realcaptcha-for-modx.html#comment-991
      1. avatar Vasler 13 апреля 2017, 21:42 #
        О, точно, так заработало. Спасибо. Так обнови пакет, братишка)) Modx итак нищебродская система на номральне модули. Если во всяких шлаковых джумлах их моря, то тут по блогам надо выискивать элементарную капчу. Хороший же модуль, дай ему жить)
    2. avatar Владимир 07 марта 2017, 11:56 #
      Подскажите, а как можно добавить кнопку «Обновить картинку» рядом с капчей, а то получается что если неправильно ввел символы, нужно закрывать popup и открывать его снова (кнопка «Сделать заявку» на сайте). Спасибо.
      1. avatar Simkin Andrew 09 марта 2017, 20:12 #
        К сожалению, Ajax не поддерживает. Если используете FormIt и AjaxForm, лучше поискать другие методы защиты от спама, например, скрытое поле, которое с помощью hook параметра FormIt проверять на корректность значения. Типа изначально пишем туда Hello spam! и если при отправке формы это значение уже другое, то определяем бота и запрещаем отправку формы.
      2. avatar roman 24 декабря 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. avatar Simkin Andrew 24 декабря 2015, 21:32 #
          ок, спасибо… поправим
        2. avatar Ромчик 08 августа 2015, 00:42 #
          Спасибо кстати огромное за компонент, очень нравился простотой и легкостью чтения символов.
          1. avatar Ромчик 07 августа 2015, 22:55 #
            После переноса сайта на др. хостинг, капча не принимает введенный код, обновление сниппета не дало результата. В чем может быть проблема?
            1. avatar Simkin Andrew 08 августа 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. avatar Ромчик 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. avatar Simkin Andrew 08 августа 2015, 12:45 #
                define('MODX_API_MODE', true);
                require $_SERVER['DOCUMENT_ROOT'].'/index.php';
                $modx->initialize('web');
                
                1. avatar Ромчик 08 августа 2015, 15:54 #
                  define('MODX_API_MODE', true);
                  require $_SERVER['DOCUMENT_ROOT'].'/index.php';
                  $modx->initialize('web');
                  Тоже не исправило (Ошибка, каптча введена неверно!). Я уже по этому случаю поверх установил Modx. Все работает, кроме каптчи ( Наверное проблема с новым хостом. В любом случае, большое спасибо за помощь!
                  1. avatar Ромчик 08 августа 2015, 16:32 #
                    Обратился в ТП хостинга, просят уточнить какие требования к хостингу со стороны CMS.
                    1. avatar Simkin Andrew 09 августа 2015, 13:54 #
                      Не знаю, что-то с сессиями наверно связано. Надо дебагером проверять, если сессии с именем RealCaptcha нет, значит по каким-то причинам она не создалась в файле assets/components/realcaptcha/kcaptcha/index.php

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

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

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

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

                        1. avatar Любовь 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. avatar Simkin Andrew 14 октября 2015, 14:00 #
                            А что, тоже не работает RealCapcha? Ну если в сессии сохраняется всё, значит неправильно отрабатывает сниппет проверки. Я могу помочь только если доступы от админки мне дашь.
                          2. avatar Ивано-Иванко 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. avatar Simkin Andrew 15 сентября 2016, 17:02 #
                              Пасиб… как нибудь обновлю пакет
                  © REALADMIN.RU   2017 г.
                  Страница сгенерирована: 0,1067 s | 10 mb.
                  На каком уровне Вы играете в шахматы?
                  О П Р О С
                  Home Question Top