Подключение "No CAPTCHA reCAPTCHA" к форуму на Invision Power Board(IPB) версии 1
Хотя Invision Power Board(IPB) версии 1 уже считается многими "устаревшим" и давно официально не поддерживается - но, тем не менее на нём ещё работает много форумов. А на них, как и форумах, работающих на других движках, одна из главных проблем это спамеры.
Встроенная капча IPB1 легко ими "обходится". Да и старая reCAPTCHA - тоже. Но вот новая(и уже исправленная) "No CAPTCHA reCAPTCHA" от Гугла - ещё достаточно надёжна. Поэтому и будем подключать её к форуму на Invision Power Board(IPB) версии 1.
В интернете, к сожалению, нет нигде методики подключения "No CAPTCHA reCAPTCHA" к IPB1. Но на одном китайском форуме отыскался патч для подключения старой версии reCAPTCHA к IPB1. Воспользуемся им - изменив под новую версию, "No CAPTCHA reCAPTCHA" .
Для начала идём на сайт Гугла вот сюда https://www.google.com/recaptcha/admin для получения ключей. Если не зарегистрированы на сайте Гугла - зарегистрируйтесь сначала(ха-ха-ха, покажите мне этого человека :-)).
В поле "Название" укажите удобное Вам название(я ставлю URL главного сайта). Затем выберите типа капчи "Invisible reCAPTCHA". В поле "Домены" внесите Ваш домен(или домены), к которым собираетесь подключить "No CAPTCHA reCAPTCHA". Галку с пункта "Отправлять владельцам оповещения" можете как оставить - так и снять. Если не хотите лишних сообщения от Гугла - снимайте. Дальше нажимаем на кнопку "Регистрация" - и получаем ключи.
Их 2 - открытый(ключ сайта) и закрытый. Теперь можем Приступить непосредственно к модификации IPB1 под "No CAPTCHA reCAPTCHA".
Дальше будет изложена последовательность редактирования файлов IPB1 для подключения к нему "No CAPTCHA reCAPTCHA". Открываем форум по FTP и производим следующие действия над файлами:
Файл /sources/Register.php :
Ищем:
function show_reg_form($errors = "") {
global $ibforums, $DB, $std;
Добавляем за ним:
require_once( 'recaptchalib.php' );
$publickey = "значение_вашего_открытого_ключа";
В строке значения $publickey, в кавычках, помещаете значение открытого ключа(ключа сайта).
Ищем:
if ($ibforums->vars['bot_antispam'] == 'gd')
{
$this->output = str_replace( "", $this->html->bot_antispam_gd( $regid ), $this->output );
}
else if ($ibforums->vars['bot_antispam'] == 'gif')
{
$this->output = str_replace( "", $this->html->bot_antispam( $regid ), $this->output );
Добавляем за ним:
else if ($ibforums->vars['bot_antispam'] == 'rec')
{
$this->output = str_replace( "", recaptcha_get_html($publickey), $this->output );
}
Ищем:
function create_account()
{
global $ibforums, $std, $DB, $print, $HTTP_POST_VARS;
Добавляем за ним:
require_once( 'recaptchalib.php' );
$privatekey = "значение_вашего_закрытого_ключа";
$resp = null;
$reCaptcha = new ReCaptcha($privatekey);
if ($_POST["g-recaptcha-response"]) {
$resp = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
}
В строке значения $privatekey, в кавычках, помещаете значение закрытого ключа.
Ищем:
//+--------------------------------------------
//| Check the reg_code
//+--------------------------------------------
if ($ibforums->vars['bot_antispam'])
{
if ($ibforums->input['regid'] == "")
{
$this->show_reg_form('err_reg_code');
return;
}
$DB->query("SELECT * FROM ibf_reg_antispam WHERE regid='".trim(addslashes($ibforums->input['regid']))."'");
if ( ! $row = $DB->fetch_row() )
{
$this->show_reg_form('err_reg_code');
return;
}
if ( trim( intval($ibforums->input['reg_code']) ) != $row['regcode'] )
{
$this->show_reg_form('err_reg_code');
return;
}
$DB->query("DELETE FROM ibf_reg_antispam WHERE regid='".trim(addslashes($ibforums->input['regid']))."'");
}
Заменяем на:
//+--------------------------------------------
//| Check the reg_code
//+--------------------------------------------
if ($ibforums->vars['bot_antispam'])
{
if ($ibforums->vars['bot_antispam'] == 'rec')
{
if (!$resp->success)
{
$this->show_reg_form('err_reg_code');
return;
}
}
else
{
if ($ibforums->input['regid'] == "")
{
$this->show_reg_form('err_reg_code');
return;
}
$DB->query("SELECT * FROM ibf_reg_antispam WHERE regid='".trim(addslashes($ibforums->input['regid']))."'");
if ( ! $row = $DB->fetch_row() )
{
$this->show_reg_form('err_reg_code');
return;
}
$code = $row['regcode'];
$code_array = array();
$code_array = explode("+", $code);
$sum_result = intval($code_array[0]) + intval(substr($code_array[1], 0, strlen($code_array[1])-1));
if ( trim( $ibforums->input['reg_code'] ) != $sum_result )
{
$this->show_reg_form('err_reg_code');
return;
}
$DB->query("DELETE FROM ibf_reg_antispam WHERE regid='".trim(addslashes($ibforums->input['regid']))."'");
}
}
Одновременно ещё код патчится на исключение одной найденной уязвимости.
Ищем конец файла, отмеченный так:
?>
Добавляем перед ним:
function recaptcha_get_html($publickey)
{
return '<div align="center" class="g-recaptcha" data-sitekey="'.$publickey.'"></div>
<script src="https://www.google.com/recaptcha/api.js"></script>';
}
Файл /sources/Admin/ad_settings.php :
Ищем:
$SKIN->form_dropdown( "bot_antispam",
array(
0 => array( '0' , 'Не использовать' ),
1 => array( 'gd' , 'Расширенный (Требуется установка GD)' ),
2 => array( 'gif' , 'Нормальный (Ничего не требуется)' ),
),
$INFO['bot_antispam']
)
Заменяем на:
$SKIN->form_dropdown( "bot_antispam",
array(
0 => array( '0' , 'Не использовать' ),
1 => array( 'gd' , 'Расширенный (Требуется установка GD)' ),
2 => array( 'gif' , 'Нормальный (Ничего не требуется)' ),
3 => array( 'rec' , 'Использовать reCAPTCHA' ),
),
$INFO['bot_antispam']
)
Замена описана для русской версии, для английской ищется и заменятся аналогично.
Файл /Skin/*/skin_register.php :
Ищем все вхождения:
<!--{REG.ANTISPAM}-->
Добавляем за ним везде, где нашли:
<!--{REG.RECAPTCHA}-->
* в пути к файлу skin_register.php означает любой подкаталог(любые подкаталоги).
Загружаем recaptchalib.php отсюда https://github.com/google/recaptcha/blob/1.0.0/php/recaptchalib.php и помещаем в каталог /sources
После этого идём в Админцентр форума и меняем в разделе Системные настройки->Безопасность в списке Включить при регистрации флуд-контроль против скриптов/ботов? значение на Использовать reCAPTCHA и сохраняем изменения.
Результат подключения новой "No CAPTCHA reCAPTCHA" по "отсечению" спамеров сказался немедленно. Если до этого при включенной старой капче reCAPTCHA(да и собственной капче IPB1) в сутки регистрировалось сотня и более ботов - то после её включения уже в течении пары суток не смогло зарегистрировать ни одного бота!
Подключение новой "No CAPTCHA reCAPTCHA" вместо старой reCAPTCHA
Возможно у Вас уже подключена старая reCAPTCHA по известной методике. Изменить подключенную по это методике старую reCAPTCHA на новую "No CAPTCHA reCAPTCHA" тоже несложно. Сделаем это.
Для начала идём на сайт Гугла вот по известному адресу https://www.google.com/recaptcha/admin для получения ключей. Да-да, ключи надо получать заново, старые ключи для прежней капчи не подходят для новой "No CAPTCHA reCAPTCHA"!
В поле "Название" укажите удобное Вам название(я ставлю URL главного сайта). Затем выберите типа капчи "Invisible reCAPTCHA"(вот оно - главное отличие новых ключей от старых! старые ключи получаются если выбрать "reCAPTCHA V2"!). В поле "Домены" внесите Ваш домен(или домены), к которым собираетесь подключить "No CAPTCHA reCAPTCHA". Галку с пункта "Отправлять владельцам оповещения" можете как оставить - так и снять. Если не хотите лишних сообщения от Гугла - снимайте. Дальше нажимаем на "Регистрация" - и получаем ключи.
Теперь открываем форум по FTP и производим следующие действия над файлами(с учётом предыдущего патча):
Файл /sources/Register.php :
Ищем:
$publickey = "значение_вашего_открытого_ключа";
Заменяем значение $publickey на новое.
Ищем:
require_once( 'recaptchalib.php' );
$privatekey = "значение_вашего_закрытого_ключа";
$resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
Заменяем на:
require_once( 'recaptchalib.php' );
$privatekey = "значение_вашего_закрытого_ключа";
$resp = null;
$reCaptcha = new ReCaptcha($privatekey);
if ($_POST["g-recaptcha-response"]) {
$resp = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
}
Заменяем значение $privatekey на новое.
Ищем:
if ($ibforums->vars['bot_antispam'] == 'rec')
{
if (!$resp->is_valid)
Заменяем на:
if ($ibforums->vars['bot_antispam'] == 'rec')
{
if (!$resp->success)
Ищем конец файла, отмеченный так:
?>
Добавляем перед ним:
function recaptcha_get_html($publickey)
{
return '<div align="center" class="g-recaptcha" data-sitekey="'.$publickey.'"></div>
<script src="https://www.google.com/recaptcha/api.js"></script>';
}
Загружаем новую recaptchalib.php отсюда https://github.com/google/recaptcha/blob/1.0.0/php/recaptchalib.php и заменяем ей старую в каталоге /sources.
Старую библиотеку recaptchalib.php от новой отличить достаточно просто. Если открыть её в любом текстовом редакторе, то в старой будет написано внутри Copyright (c) 2007 reCAPTCHA, в моём экземпляре на 11-й строке и размер у него будет 9910 байт(такой у меня во всяком случае). В новой же будет написано Copyright (c) 2014, Google Inc., тоже на 11-й строке. И размер у неё будет 4574 байта(во всяком случае у того, что есть у меня - такой размер).
Настройки в Админцентре в данном случае менять не нужно, новая "No CAPTCHA reCAPTCHA" начнёт работать сразу после изменения файла /sources/Register.php и замены библиотеки recaptchalib.php на новую.
Статья обсуждается на Всеобщем форуме в этом топе.
Копия статьи помещена в мой дневник.
|