тюнинг капчи (reCAPTCHA)

1. Введение.
почитав топик о тюнинге Капчи и решил попробовать прикрутить рекапчу. reCAPTCHA — это система для защиты веб-сайта от интернет ботов (для защиты от спама), которая с пользой использует затраченные на ввод изображения время человека, с целью распознавания книг. Полученное мной решение не идеальное, имеет некоторые недоработки, но, что удивительно (смайл), работает. Буду рад, если хоть кто нибудь подскажет и поможет доработать до оптимального состояния.

2. Установка
2.1 Подготовка
Первым делом, нужно зарегистрироваться на официальном сайте для получения API ключей, а также скачать библиотеку для работы с рекапчей. Библиотеку лично я положил в classes/lib/external/recaptcha/recaptchalib.php
2.2 Добавление reCAPTCHA
правим файл templates/skin/new/actions/ActionRegistration/index.tpl
находим в нем
{$aLang.registration_captcha}:<br />
			<img src="{$DIR_WEB_ROOT}/classes/lib/external/kcaptcha/index.php?{$_sPhpSessionName}={$_sPhpSessionId}">
			<p><input type="text" class="input-text" style="width: 80px;" name="captcha" value="" maxlength=3 /></p>

заменяем это на
{$aLang.registration_captcha}:<br />
<script type="text/javascript"
    src="http://api.recaptcha.net/challenge?k=ВАШ_PUBLIC_KEY">
</script>

где ВАШ_PUBLIC_KEY — ваш публичный ключ, полученный на recaptcha.net

идем в файл classes/actions/ActionRegistration.class.php
находим

if (!isset($_SESSION['captcha_keystring']) or $_SESSION['captcha_keystring']!=strtolower(getRequest('captcha'))) {
				$this->Message_AddError($this->Lang_Get('registration_captcha_error'),$this->Lang_Get('error'));
				$bError=true;
			}

меняем на

$resp = null;
if ($_POST["recaptcha_response_field"]){
        $resp = recaptcha_check_answer (ВАШ_PRIVATE_KEY,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);}
if ($resp==null or !$resp->is_valid){
$this->Message_AddError($this->Lang_Get('registration_captcha_error'),$this->Lang_Get('error'));
				$bError=true;
			}

где ВАШ_PRIVATE_KEY — ваш приватный ключ, полученный на recaptcha.net
в начало файла вставить
require_once (DIR_SERVER_ROOT."/classes/lib/external/recaptcha/recaptchalib.php");

Проверяем
3. Недоработки и проблемы
3.1 Капча
У данной капчи есть свои недостатки. Если сервер рекапчи упадет, зарегистрироваться пользователи несмогут.
3.2 Код
Почему то в темплейте не подхватывается константа из config.php RECAPTCHA_PUBLIC_KEY. скажем
код
{$aLang.registration_captcha}:<br />
<script type="text/javascript"
    src="http://api.recaptcha.net/challenge?k={$RECAPTCHA_PUBLIC_KEY}">

у меня не работает. Кто подскажет как исправить, то буду рад.

44 комментария

avatar
Народ, а разве не проще сделать каптчу в виде сумы цифр или ответа на банальный вопрос?
Зачем изобретать ище один велосипед?
avatar
может быть я хочу помогать в распознавании книг XD
avatar
кстати я тут подумал, что капча с суммой цифр не такая уж и хорошая идея. компьютер считает в любом случае лучше( и намнооооого быстрее) человека. а у меня есть знакомые, которые 34+57 могут выщитывать около минуты. Для них это будет жесть.
avatar
ой да ладно. всегда же можно нажать win + r, набрать calc и посчитать при помощи компьютера. :)
avatar
есть такое слово «влом». при таком раскладе лично я бы ушел с сайта.
avatar
а рекапча — это ужас монструозный для параноиков, как мне кажется :)
avatar
зато одна из немногих действенных капч. вкупе с чекбоксом «я не робот» эффект максимальный))
avatar
:) не повезло вам со знакомыми

Можно сделать каптчу как сумму 3 цифр, а цифры брать от 1 до 5 например!
Вариантов много!
avatar
Матанова капча (как вариант)
avatar
на мой взгляд, текущая каптча визуально проще для ввода, нежели recaptcha

у кого-то в проекте были случаи взлома каптчи?
avatar
а как ты думаешь боты регистрируются?
avatar
антикапча как вариант ну и ocr, никакого взлома
avatar
а ocr это по вашему не взлом? тогда я не понял, что вы имеете ввиду под этим словом
avatar
взлом — это несанкционированный доступ
avatar
ну ок. и как же тогда можно «взломать капчу»?
avatar
эта формулировка некорректна, капчу можно «обойти»
avatar
Это игры «в слова» и занудство.
avatar
Я одинадцать лет назад писал курсовую по неправомерному доступу информации, с тех пор крепко засело в голове. Можно на пальцах доказать, почему это не игра в слова и чем важна разница, но это уж точно будет занудство. Одиннадцать лет!!1 я и диод… ну, ты понел ;-)
avatar
блин, это круто конечно, но вот я например как и 99% человека вокруг курсовой на эту тему не писали и поэтому выражение взломать что-угодно применяют во всех смыслах какие только можно придумать, и что самое дурацкое — понимают друг-друга.

я тоже за чистоту языка и правильность понятий, но лучше просто выдать определение, чем играть в слова,

хотя весь этот флуд доставляет
avatar
Краткое определение — выше. Поскольку условием для получения доступа является распознавание картинки, то регистрация ботов на сайте — это санкционированный доступ к информации. Попрошу не очернять словом «флуд» академическую дискуссию
avatar
Противоречиво как то всё получается.
Условием получения доступа, вообще-то, является то, что регистрирующийся — человек. Капча, это проверка на человечность. Если её проходит робот, значит проверка не работает -> сломана, взломана
avatar
Для вас такие выкладки выглядят противоречиво потому, что вы смешиваете цели и задачи капчи.

Нет и в обозримом будущем не будет ни единого стопроцентно работающего способа удостовериться, что форму отправляет человек, а не робот. Откройте код и посмотрите — никакой проверки на человечность там нет, есть проверка на соответствие символов на картинке символам, введённым в форме. Это и есть условие для получения доступа.
avatar
ну ведь «проверка на соответствие символов» это вариант «проверки на человечность» и вообще таких проверок можно придумать хоть тысячу штук проблема только в том, что если взломщик (вот как его назвать?) решится составить алгоритм для обхода именно этой проверки — он его составит…

ладно. нас уже минусовать начали.
avatar
То, что минусуют — это нормально. Здесь же не профессиональное сообщество. На каком-нибудь нуллед.вс, я думаю, обывательская реакция могла быть более резкой. Школоло не спит!
avatar
Цель капчи определить бот или человек проходит регистрацию. Если бот успешно проходит проверку капчей, то это и явлеяется ее взломом. ИМХО!
avatar
Цели вы правиьно обозначили, а задача капчи — распознавание символов на картинке. Поскольку бот успешно распознаёт капчу, задача решается корректно. Никакого взлома. Точно также, как и войти в незапертую дверь, просто повернув ручку-защёлку и открыв её.
avatar
Точно также, как и войти в незапертую дверь, просто повернув ручку-защёлку и открыв её.

тут вы неправы. капча в данном случае — это и есть замок, который можно либо открыть ключем, либо подобать ключ по профилю пути замочной скважины, что и делает робот.
avatar
Это частности, настоящий замок обеспечивает достаточную защиту и отмычки к нему не предлагаются на каждом углу, в отличие от ocr-софта и инвайтов на антикапчу.

Если от образности обратиться в правовое русло, то существует судебная практика, которая не признаёт техническим средством защиты алгоритм, для обхода которого существуют широко доступные средства. Пример — процессы, связанные с программой deCSS.
avatar
я еще не видел упоминания о взломе рекапчи, если вы об этом. Может я что-то пропустил?
avatar
Я говорил о том, что говорить о взломе капчи некорректно. Что касается сервиса «рекапча», то способы надёжного его обхода существуют, один из них я упомянул выше. Этот сервис не сможет остановить всех ботов, но значительную из часть, возможно, остановит.
avatar
самая надёжная защита от ботов это своя голова — неожиданный подход и уникальность решения. Массовые способы защиты обречены на взлом, всё
avatar
и всё равно правильнее называть это взломом, а не обходом.
avatar
Если вы привыкли пользоваться обывательскими терминами — почему бы и нет? Я не настаиваю и никого не хочу ни в чём убедить, называйте как хотите. Кому-то выражения «ордер на обыск», «завели дело» и т. п. режут слух, а кто-то их считает нормой.

В этой области полно широко распространённых заблуждений, и это нормально. Вы правильно отметили, что 99% людей не сталкивались с этим на практике, а потому говорят, как привыкли, как говорят все вокруг. Отчасти, это вина малограмотных журналистов, которые такие вещи внедряют в массовое сознание.
avatar
Проделал всё по инструкции, но появляется белый экран на странице регистрации.

require_once (DIR_SERVER_ROOT."/classes/lib/external/recaptcha/recaptchalib.php");
надо ведь в classes/actions/ActionRegistration.class.php вставлять?

А этот код
{$aLang.registration_captcha}:<br />
<script type="text/javascript"
    src="http://api.recaptcha.net/challenge?k={$RECAPTCHA_PUBLIC_KEY}">

вставлять в templates/skin/new/actions/ActionRegistration/index.tpl?
avatar
да, все правильно. а PUB и PRIVAT ключи вводили?
avatar
Вводил. Белый экран всё равно. Может мне кто выслать свой файл ActionRegistration.class.php, а я там ключ свой вставлю просто. Напишите в ЛС, кто может.
avatar
ithint.ru/registration/
тут капча работает нормально. только что сделал сам.
кстати, совсем проглядел
{$aLang.registration_captcha}:<br />
<script type="text/javascript"
    src="http://api.recaptcha.net/challenge?k={$RECAPTCHA_PUBLIC_KEY}">

так вставлять не надо. правильней будет
{$aLang.registration_captcha}:<br />
<script type="text/javascript"
    src="http://api.recaptcha.net/challenge?k=6LdTNgYAAAAAAPqgixUorBM-RVdN073VZbZn1kES">
</script>

не знаю почему, но нихочет яваскрипт подхватывать константу {$RECAPTCHA_PUBLIC_KEY}
да и еще, ActionRegistration начинаться должен так
<?php
require_once (DIR_SERVER_ROOT."/classes/lib/external/recaptcha/recaptchalib.php");
/*-------------------------------------------------------
*
*   LiveStreet Engine Social Networking
*   Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
*   Official site: www.livestreet.ru
*   Contact e-mail: rus.engine@gmail.com
*
*   GNU General Public License, version 2:
*   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/

пробуйте :)
avatar
Щас пол часа парился у самого был белый экран всё дело в пропущеных ковычках.

Всё сделал как было написано выше и нашёл ошибку
в classes/actions/ActionRegistration.class.php


$resp = null;
if ($_POST["recaptcha_response_field"]){
        $resp = recaptcha_check_answer (ВАШ_PRIVATE_KEY,$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);}
if ($resp==null or !$resp->is_valid){
$this->Message_AddError($this->Lang_Get('registration_captcha_error'),$this->Lang_Get('error'));
                                $bError=true;
                        }


А должно быть так:

$resp = null;
if ($_POST["recaptcha_response_field"]){
        $resp = recaptcha_check_answer ('ВАШ_PRIVATE_KEY',$_SERVER["REMOTE_ADDR"],$_POST["recaptcha_challenge_field"],$_POST["recaptcha_response_field"]);}
if ($resp==null or !$resp->is_valid){
$this->Message_AddError($this->Lang_Get('registration_captcha_error'),$this->Lang_Get('error'));
                                $bError=true;
                        }

Кто не заметил, то я вписал privat_key в одинарные скобки
'ВАШ_PRIVATE_KEY'


Теперь у меня рекаптча нормально работает. Проверял в Firefox и IE
avatar
спасиб. только у меня вроде работает и без кавычек.
avatar
Стоп, а разве правильно:
if ($_POST["recaptcha_response_field"]){


Ведь если я допустим через хром или оперу, ну или программным способом вырежу часть получение капчи, то у нас и не будет существовать recaptcha_response_field, а значит и проверки нет
avatar
reCAPTCHA — это адский ад любого пользователя, особенно радостно встретиться с ней тем, кто не владеет иностранными языками. Терпеть ее не могу, хоть и знаю английский. Особенно бесит, когда предлагает вводить всякие длинные штуки с символами. Бывает, раз десять приходится жать на обновить, чтобы вылезло что-нибудь покороче и попроще.
avatar
По вашему у меня не заработало! Постоянно пропускало даже с неправильной каптчей или вовсе без неё!
Делайте правильно!
$resp = null;
if (array_key_exists('recaptcha_challenge_field',$_POST)){
$resp = recaptcha_check_answer ('АЙДИКАПТЧИ',$_SERVER[«REMOTE_ADDR»],getRequest(«recaptcha_challenge_field»),getRequest(«recaptcha_response_field»));}

if ($resp==null or !$resp->is_valid){
$this->Message_AddError(«Неверно введена каптча»,$this->Lang_Get('error'));
$bError=true; return false;

}
avatar
« кавычки только внимательней подменились
avatar
$resp = null;
 
 
                     
if (array_key_exists('recaptcha_challenge_field',$_POST)){
$resp = recaptcha_check_answer ('ключАЙДИКАПТЧИ',$_SERVER["REMOTE_ADDR"],getRequest("recaptcha_challenge_field"),getRequest("recaptcha_response_field"));}
 

if ($resp==null or !$resp->is_valid){
$this->Message_AddError("Неверно введена каптча",$this->Lang_Get('error'));
$bError=true;return false;

}
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.