Пятница, 26 августа, 2011 года

Защита phpBB3 от спам ботов | Капча + вопрос

Защита phpBB3 от спам ботов | Капча + вопрос

Результат

 

Проблема всем известна, нескончаемый поток спама на форуме, не смотря на встроенную защиту в виде капчи?
Спам боты с каждым днем совершенствуются, становятся все умнее, подтверждать регистрацию по почте, распознают родную капчу и ReCapcha им уже позубам 🙁

Прикрутим модифицированную капчу и посмотрим как они справятся. Первое, отключаем родную капчу в админ панели, второе, идем в папку:

/styles/<имя вашей папки шаблона>/template/ucp_register.html;

И ищем там такой код:

<!-- IF CAPTCHA_TEMPLATE -->
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
<!-- ENDIF -->

Меняем его на этот:

<div class="panel">
<script type="text/javascript">
// <![CDATA[function on_update(){
var random_num = (Math.round((Math.random()*9)+1));
document.getElementById('reload').src = 'capcha/img.php?s='+random_num;
}
// ]]>
</script>
<div class="inner">
 <span class="corners-top"><span></span></span>
 <h3>Защита от спам ботов</h3>
 <p>введите код на картинке: <input type="text" name="numbs" id="numbs" size="40"></p>
 <img src="capcha/img.php" id="reload" alt="" border="0">
</div>
  <a href="javascript:on_update();" style="font-size:9px;">обновить картинку</a><br><hr><br>
  <p>Введите название 8-го месяца: <input type="text" name="questansw" size="40"> </p>  
  <span class="corners-bottom"><span></span>
  </span>
  </div>
</div>

Этот ХТМЛ код содержит в себе 2 степени защиты, первая это собственно капча, которую мы сами сделаем. Боты пишут для огромного числа форумов, по-этому если ваш форум имеет несколько иную структуру, это вводит их в заблуждение, а вас на какое то время избавляет от спама. Мы не будем рисковать и усложним им жизнь, сделав двойную защиту, кроме капчи, прокрутим ответ на простой вопрос. Как вам, «Введите название 8-го месяца», ответ будет естественно «август», человек именно так и ответит, а вот нелюдь не сможет, пока автор бота не напишет для него изменений в алгоритме.
Только не ставьте вопросы из серии: «сколько будет 6+10=», их роботы раскалывают, или слишком заумные вопросы, которые только затруднят реальным пользователям регистрацию. Тут нужен разумный компромис.

Поставить этот ХТМЛ код можно в админ панели в разделе стили, или локально, а потом залив по ftp, но в последнем случае нужно обязательно сбросить кэш в админ панели, иначе вы не увидите изменений. Теперь нам надо в ПХП код поставить проверку этих полей и код новоиспеченной капчи.

Открываем фаил /includes/ucp/ucp_register.php и в 221 строке ставим код, сразу после:

if (!check_form_key('ucp_register'))
{
     $error[] = $user->lang['FORM_INVALID'];
}

Этот код:

session_start();
 
$_POST['numbs'] = (INT)$_POST['numbs'];
$k = false;
 
// проверка капчи
if(empty($_SESSION['num']) && empty($_POST['numbs']) || $_POST['numbs'] == 0){
       $error[] = 'Введите проверочный код';
       $k = true;
       unset($_SESSION['num']);
}
if($_SESSION['num'] > 0 && $_SESSION['num'] != $_POST['numbs'] && !$k){
 
        $error[] = 'Проверочный код не совпадает с кодом на картинке!';
} 
 
// проверка защиты вопрос - ответ
$_POST['questansw']  = mb_convert_case($_POST['questansw'] , MB_CASE_LOWER, "UTF-8");
 
if($_POST['questansw'] != 'август'){
         $error[] = 'Неверный ответ на вопрос';
 
}
unset($_SESSION['num']);
session_destroy();

Этот файл вам через админку вам поправить не удастся, поэтому правим локально любым редактором который позволяет сохранять в кодировке UTF без BOM, это очень важно! Итак, входящие данные мы проверяем на iteger ($_POST['numbs']), сравниваем с установленной сессией, сессию устанавливаем в генераторе капчи. Если вы меняете вопрос, ставьте его тут: $_POST['questansw'] != 'сентябрь', не забудте кавычки.

Перейдем к созданию самой капчи. Создайте папку в корне форума с именем capcha, в ней создайте файл img.php сохраните в кодировке UTF без BOM, это очень важно! Так же подберите 3-4 шрифта, и скопируйте их в папку capcha, я использовал эти, честно скажу долго не копал, лень было 🙂 Шрифты берите ttf, не слишком тяжелые. Не берите рукописные и стандартные шрифты, лучше брать шрифт с разными шумами и засечками.

<?
session_start();
header("Content-type: image/jpeg");
$w=120; // размеры капчи по ширине
$h=40; // размеры капчи по высоте
$im = imagecreatetruecolor($w,$h);
$white = imagecolorallocate($im, 241,241,241); // цвет фона
$red = imagecolorallocate($im, 0,0,102);
$black = imagecolorallocate($im, 0,0,0);
$black2 = imagecolorallocate($im, 0xbb,0xbb,0xbb);
imagefill ($im,10,10,$white);
$angle=0;
$x=5;
$text=''. mt_rand(10000,99999);
$i=mt_rand(0,2);
$text[$i+1]=$text[$i];
$i=mt_rand(0,2);
$text[$i+1]=$text[$i];
$_SESSION['num']=$text;
$path = dirname(__FILE__).'/';
$fonts = array('имя_вашего_шрифта_1.ttf','имя_вашего_шрифта_2.ttf','имя_вашего_шрифта_3.ttf'); // тут введите название ваших шрифтов!
$s1=17;
$s2=$s1-2;
$angle=mt_rand(-5,5);
for($i=0;$i<=4;$i++){
     $y=32+mt_rand(0,2);
     $font=$fonts[mt_rand(0,count($fonts)-1)];
     imagettftext($im, $s1, $angle, $x, $y, $red, $path.$font, $text[$i]);
     imagettftext($im, $s2, $angle, $x, $y, $black, $path.$font, $text[$i]);
     $x+=(17+mt_rand(0,2));
     $angle+=2;
}
imageinterlace($im,1);
imagejpeg($im,'',90);
imagedestroy($im);
?>

Код писал не я, а некий хороший человек Джелу ссылку на его блог обязательно поставлю как найду, просто затерялась в закладках.
Работа по доводке форума напильником 😉 занимает 5 мин! А результат на отлично, по крайней мере пока.
Увидели неточности, или возникли проблемы с установкой, пишите попробуем разобраться вместе.


 
 

2 комментария на “Защита phpBB3 от спам ботов | Капча + вопрос”

  1. Сергей aka.Dem1k Ильin Пишет:
    29 сентября, 2011 в 14:45

    Спасибо Большое очень помогли)))))

  2. you too Пишет:
    30 сентября, 2011 в 00:06

    Приятно 🙂 Значит не зря писал.

Оставьте комментарий!

Записи в RSS и Комментарии в RSS.