Защита phpBB3 от спама своими методами.

Веб-программирование 23 апреля 2011 г., 7:49

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

На форуме по phpbb, пишут про создание обязательных полей, мне это абсолютно не помогло, поэтому я решил сделать небольшие фиксы сам. Вначале отключаем капчу в админской панели, далее, идем в папку:

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

И находим там вот этот код:

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

И заменим его на:

	<script type="text/javascript">
		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="panel">
		<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>
		</div>
	</div>

Этот HTML код содержит в себе свою капчу. Боты делают для большого числа форумов, по-этому если ваш форум имеет иную структуру, это довольно на долго уберет ботов.

Поставив этот html код, мы сбрасываем кэш в администраторской панели. Теперь нам надо в php код поставить проверку этих полей и свой код капчи.

Для того что бы это все заработало, откройте фаил /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'])){
		$error[] = 'Введите проверочный код';
	} else if( $_SESSION['num'] != $_POST['numbs']){
		$error[] = 'Проверочный код не совпадает с кодом на картинке!';
	} 

	unset($_SESSION['num']);
	session_destroy();

Итак, входящие данные мы проверяем на INT $_POST['numbs'], сравниваем с установленной сессией, сессию устанавливаем в генераторе капчи.

Теперь перейдем к созданию капчи. Создайте папку в корне форума capcha, там фаил img.php. Так же подберите у себя 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('001.ttf','002.ttf','003.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. Не забудьте отключить старую капчу в администраторской панеле. Если вы увидели какие то неточности пишите в комментарии



Станьте первым!

Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!

Яндекс.Метрика