ICQ214-697-723 | Emailinfo@mainsource.ru | Телефон(812) 946-31-81
Все контакты
Автор статьи
Синцов Роман

Подключение reCaptcha вместо стандартной капчи UMI.CMS

Сразу хочу обратить Ваше внимание, что описанный способ внедрения CAPTCHA производится на уровне ядра системы, поэтому использовать его крайне не рекомендуется. Кроме того, эти правки могут нарушить корректную работу системы, а также однозначно лишат Вас возможности обновления системы. Однако существуют проекты, в которых можно пожертвовать обновлением ради того, чтобы внедрить этот инструмент защиты своего проекта от интернет-ботов.

Предложенный вариант решения будет добавлен в UMI.Hub и предложен разработчикам системы для внедрения в «коробку». Возможно данное решение будет видоизменено, но то, что оно актуально — это факт.
Для тех, кому это решение нужно здесь и сейчас, описание внедрения представлено ниже.

В последнее время все больше наших клиентов сталкиваются с проблемами спама и автоматической регистрации ботами. В связи с этим им не достаточно существующий капчи. Данная статья будет посвящена способу добавления в UMI.CMS самой, на мой взгляд, эффективной в настоящий момент капчи — recaptcha.
Подробнее о том, как устроена reCaptcha можно почитать в википедии. Важное замечание: в стандартную коробку UMI.CMS (2.8) входит популярная капча — kcaptcha, но как показала практика ее тоже бывает недостаточно.

Вариантов внедрения recaptcha в систему управления существует несколько. Я опишу на мой взгляд наиболее демократичный и расширяемый. В корне Вашего сайта на UMI.CMS есть config.ini, в котором указан параметр

captcha.drawer = "default"
Этот параметр задает название класса для отрисовки капчи. Для работы recaptcha требуется приватный и публичный ключи, которые Вы уже должны были получить. Вам необходимо изменить параметр captcha.drawer и добавить два новых параметра в config.ini:

captcha.drawer = "recaptcha"
captcha.publickey = "6LcnzcoSAAAALkFSNqUgQg132pXXXXXXXXXXXXXX"
captcha.privatekey = "6LcnzcoSAAAANmgmobsR0P434XXXXXXXXXXXXXX"

Далее нужно скачать саму библиотеку для работы с reCaptcha. Исходник берем тут. На момент написания статьи последняя доступная версия 1.11. В загруженном архиве Вы найдете саму библиотеку recaptchalib.php и примеры ее использования.

Эту библиотеку размещаем в следующей директории « /classes/system/utils/captcha/drawers/ ». После этого нужно внести правки в основной класс umiCaptcha, расположенный в « /classes/system/utils/captcha/umiCaptcha.php », в метод generateCaptcha().

Код вставляем сразу после:

if (!self::isNeedCaptha()) {
return xslTemplater::getInstance()->getIsInited() ? array(
'comment:explain' => 'Captcha is not required for logged users') : '';
}

Код для вставки:

$config = mainConfiguration::getInstance();
$drawerName = $config->get('anti-spam', 'captcha.drawer');

if ($drawerName == 'recaptcha'){
require_once CURRENT_WORKING_DIR . '/classes/system/utils/captcha/drawers/recaptchalib.php';

$publickey = $config->get('anti-spam', 'captcha.publickey');
$block_arr['attribute:type'] = 'recaptcha';
$block_arr['captcha'] = recaptcha_get_html($publickey);

list($template_captcha) = def_module::loadTemplates("tpls/captcha/{$template}.tpl", "captcha");

return def_module::parseTemplate($template_captcha, $block_arr);
}

В данном фрагменте кода, используя функцию recaptcha_get_html($publickey), мы получаем код нашей капчи. В результате выполнения метода (/udata/system/captcha/) полученный нами xml будет иметь вид:

<udata type="recaptcha" module="system" method="captcha" generation-time="0.004332">
<captcha>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=6LcnzcoSAAAA877ALkFSNqUgQp09XXXXXXXXXXX"></script>
<noscript>
<iframe src="http://www.google.com/recaptcha/api/noscript?k=6LcnzcoSAdAALkFхз0SNqUgQg1XXXXXXXXXX" height="300" width="500" frameborder="0"></iframe>
<textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
</noscript>
</captcha>
</udata>

Кроме этого, нам надо осуществить проверку результата, который мы получили после отправки формы с капчей. Для этого редактируем метод checkCaptcha().

Код вставляем сразу после:

$permissions = permissionsCollection::getInstance();
if ($permissions->isAuth()) return true;

Код для вставки:

$config = mainConfiguration::getInstance();
$drawerName = $config->get('anti-spam', 'captcha.drawer');

if ($drawerName == 'recaptcha'){
require_once CURRENT_WORKING_DIR . '/classes/system/utils/captcha/drawers/recaptchalib.php';
$privatekey = $config->get('anti-spam', 'captcha.privatekey');

$resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"],
$_POST["recaptcha_challenge_field"],
$_POST["recaptcha_response_field"]);
if ($resp->is_valid) {
return true;
}
return false;
}

В данном фрагменте кода, используя функцию recaptcha_check_answer, осуществляем проверку правильности ввода капчи. Подробнее о стандартных функциях библиотеки reCaptcha читаем тут.

Далее привожу пример шаблона для xslt-шаблонизатора:

<!--- reCapthca -->
<xsl:template match="udata[@module = 'system' and @method = 'captcha' and @type='recaptcha']">
<tr>
<td width="180" style="padding-right: 20px;">
&captcha-text;
</td>
<td valign="top" class="captcha" style="padding-left:10px">
<script type="text/javascript">
var RecaptchaOptions = {
theme : 'white',
lang : 'ru'
};
</script>
<xsl:value-of select="." disable-output-escaping="yes"/>
</td>
</tr>
</xsl:template>

В шаблоне для изменения внешнего вида капчи используется следующий код (подробнее смотрим тут):

<script type="text/javascript">
var RecaptchaOptions = {
theme : 'clean',
lang : 'ru'
};
</script>

Изображение формы регистрации с использованием reCaptcha
Вот что мы получим в результате описанных правок.

Надеюсь, данный материал окажется Вам полезен. Всем удачи!

Опубликовано в декабре 2011 года.

Softcoder [15.12.2011 13:06]
То что надо. Тоже столкнулся с проблемой взлома стандартной капчи юми на сайте.
Recaptcha рулезз

Перейти к списку статей

АкцияИнтересные акции и предложения

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

полный список

Наши специалисты имеют высшее образование в сфере компьютерных технологий, а также многолетний опыт работы по своим направлениям.

Мы постоянно повышаем квалификацию наших сотрудников и расширяем список IT-технологий с помощью которых могут быть реализованы любые Ваши задачи.

вакансии Вакансии партнеры Партнеры
отзывы Отзывы сотрудники Сотрудники
faq Вопросы и ответы

Реализованные проекты

vzemle.ru Буровой сайт
Информационный сайт на базе CMS 1С-Битрикс "под ключ".
pro-tours.ru Форум под ключ
Туристический портал для общения, реализованный на популярном движке.

другие

MainSource