Битрикс: защита форм от спамеров. Подключаем stopforumspam

25 Мая 2013 23:22 ::: Просмотров 13420 ::: Комментариев 0

Начали одолевать спамеры в комментариях, надоело каждый раз вычищать мусор после них? Предлагаю простое и эффективное решение - проверка через сервис stopforumspam.com. Stopforumspam представляет собой базу данных ip адресов, емайлов и логинов, под которыми регистрируются боты спамеров. Доступ свободный для получения информации, чтобы добавить злостного спамера в базу  надо зарегистрироваться. Для многих движков сайтов и форумов есть готовые плагины. Запрос информации — это обычный get запрос, все очень просто и понятно.

Подключаем проверку в "Битрикс: управление сайтом". К примеру, это может выглядеть следующим образом. В /bitrix/components/  создаем папку tools, куда ложим файл tools.php:

<?php
function checkSpambots($mail='', $ip='', $name='') {
	$spambot = false;
	$dir = $_SERVER["DOCUMENT_ROOT"].'/_spambot/';

	if($mail!=''){
	$xml_string = file_get_contents('http://api.stopforumspam.com/api?email=' . $mail);
		$xml = new SimpleXMLElement($xml_string);
		if ($xml->appears == 'yes') {
			$spambot = true;
		}
	}
	if($ip!='' and $spambot===false) {
		//e-mail not found in the database, now check the ip
		$xml_string = file_get_contents('http://api.stopforumspam.com/api?ip=' . $ip);
		$xml = new SimpleXMLElement($xml_string);
		if ($xml->appears == 'yes') {
			$spambot = true;
		}
	}
	if($name!='' and $spambot===false) {
		$xml_string = file_get_contents('http://api.stopforumspam.com/api?username=' . $name);
		$xml = new SimpleXMLElement($xml_string);
		if ($xml->appears == 'yes') {
			$spambot = true;
		}
	}
	if ($spambot == true) {
		$fname = $dir . $ip . '.txt';
		if (file_exists($fname)) {
			$spambot_old_info = file_get_contents($fname);
			$spambot_old_info = explode(',', $spambot_old_info);
			$spambot_old_info[2] = $spambot_old_info[2] + 1;
			$spambot_old_info = implode(',', $spambot_old_info);
			file_put_contents($fname, $spambot_old_info);
		} else {
			$parts = explode('/', $fname);
        	$file = array_pop($parts);
        	$dir = '';
        	foreach($parts as $part)
            	if(!is_dir($dir .= "/$part")) mkdir($dir);
			$spambot_info = $ip . ',' . $name . ',1';
			file_put_contents($fname, $spambot_info);
		}
	}
	return $spambot;
}

Функция принимает параметрами емайл, айпи-адрес и логин субъекта, пытающегося оставить комментарий, и последовательно проверяет их путем запроса к stopforumspam.com. Если хоть по одному параметру пользователь уличен в спамерстве, создаем (или обновляем если уже есть) файлик с данными о спамере и количеством попыток - это будет примитивный журнал вторжений :)

Вызов функции может выглядеть так (где-то в компоненте):

if(strip_tags($_POST["NAME"]) != "") $arResult["NAME"] = trim(strip_tags($_POST["NAME"]));
else $arResult["ERROR"][] = GetMessage("COMMENT_ERROR_NAME");

if($_POST["WWW"] != "") $arResult["WWW"] = trim(strip_tags($_POST["WWW"]));

if ($_SERVER["HTTP_X_FORWARDED_FOR"]) $clientIP = $_SERVER["HTTP_X_FORWARDED_FOR"];
else $clientIP = $_SERVER["HTTP_CLIENT_IP"];
$clientProxy = $_SERVER["REMOTE_ADDR"]; if(strlen($clientIP) <= 0) { $clientIP = $clientProxy; $clientProxy = ""; } if(checkSpambots('',$clientIP,'')===true) $arResult["ERROR"][] = "Изыди, проклятый спамер!"

Чтобы функцию можно было вызывать беспроблемно в любом месте кода, в файл /bitrix/php_interface/init.php добавляем строчку

require_once ($_SERVER["DOCUMENT_ROOT"].'/bitrix/components/tools/tools.php');

Это был пример для комментариев. Если на сайте разрешено комментировать только зарегистрированным пользователям, особо упорные спамеры могут даже зарегистрироваться, чтобы нагадить в блоге или форуме. Чтобы защитить сайт от спамеров сразу в процессе регистрации и пресечь ее на корню, в том же файле /bitrix/php_interface/init.php добавляем код:

AddEventHandler("main", "OnBeforeUserRegister", Array("XUser", "BeforeRegister"));

class XUser {
	function BeforeRegister(&$arFields) {
		$spambot = checkSpambots($arFields['EMAIL'], $arFields['USER_IP'], $arFields['NAME']);
if ($spambot == true) { $GLOBALS['APPLICATION']->ThrowException('Registration is forbidden for you. Send abuse to the administrator<br>Вам регистрация запрещена. Обратитесь к администратору'); return false; } } }

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

Возврат к списку