Эффективная борьба со спамом в phpBB3

Повадился на мой форум лазить хрумер, проклятие на оба дома придумавших эту бесовскую программу. Но как говорится, и со старухой бывает порнуха, ой, на старуху найдется проруха. У меня уже 2 недели отключена капча и ни одной левой регистрации и сообщения. Обычно было около 10 новых роботов в день.

Похожу идею борьбы с автоматическим спамом я  описывал и предлагал обсудить еще раньше. Но саму идею я немного переработал. Итак сама идея:

1) Пользователь заходит на форум  — создается ассоциативный массив  в котором ключи это названия полей, которые идут в оригинале, а значение новое имя поля. Массив записывается в сессию.

2) Средствами javascript изменяем названия полей.

3) Добавляем проверку в получение данных: мы должны проверять, если в массиве созданном в пункте один есть ключ совпадающий с именем запрашиваемого поля, то значение берется из переменной $_POST имя которой совпадает с найденным значением.

Теперь сама реализация.

1) Открываем файл common.php. После строки

$starttime = $starttime[1] + $starttime[0];

Добавляем следующее:

ini_set('session.use_only_cookies', '1');
ini_set('session.auto_start', '1');
session_start();

/**
 * @author Aravak
 * @site https://js-php.ru/
 *
 */
function anti_spam_aravak()
{
	global $aAntiSpamVarNames;
	if( !array_key_exists('generated_names' , $_SESSION) )
	{
		$aAntiSpamVarNames = array("username" => uniqid('us'),
						   "new_password" => uniqid('pwd'),
						   "email"	  => uniqid('eml'),
						   "email_confirm" => uniqid('eml2'),
						   "message"	=> uniqid('msg') );
		$_SESSION['generated_names'] = $aAntiSpamVarNames;
	}
	else
	{
		$aAntiSpamVarNames = $_SESSION['generated_names'];
	}

}
anti_spam_aravak();

Немного поясню: в функцию uniqid, как значение можете передавать какую угодно строку, или совсем ничего не передавать. Но на мой взгляд лучше придумать что-то свое, уникальное. Итак, нужный нам массив мы создали.

2. Открываем includes/functions.php и в конец добавляем такую вот функцию:

function getAntiSpanJavaScript()
{
	global $aAntiSpamVarNames;
	$script = '';
	$jsArrayUniqName = uniqid('cvr');

$script = "
var RewritedMessageName;
function  myRewrite() {
  var ".$jsArrayUniqName." = new Array();";
  	foreach( $aAntiSpamVarNames as $realName => $securName )
  	{
		$script .= $jsArrayUniqName . "['".$realName."'] = '".$securName ."';";
	}
  $script .= "
  var allInputs = document.getElementsByTagName('input');
  var allTextareas = document.getElementsByTagName('textarea');

  var allElems = new Array();
  for(var i=0; i< allInputs.length; i++)
  {
  	if( (allInputs[i].type==\"text\" || allInputs[i].type==\"password\") && allInputs[i].name )
  	{
			allElems[allElems.length] = allInputs[i];
  	}
  }

  for(var i=0; i< allTextareas.length; i++)
  {
  	if( allInputs[i].name ){
			allElems[allElems.length] = allTextareas[i];
	}
  }

  for(var i=0; i< allElems.length; i++)
  {
  	if( allElems[i].name ){
  		var inputName = allElems[i].name;
	  	if(".$jsArrayUniqName."[inputName]){
			allElems[i].name = ".$jsArrayUniqName."[inputName];
	  	}
  	}

  }
  RewritedMessageName = " . $jsArrayUniqName . "['message'] 

}";
	return $script;
}

Объясню, почему это добавляется в php-коде. Во-первых php быстрее чем шаблонизатор, во-вторых, по секрету скажу, есть еще функция шифрования javascript, правда из-за сырости я её пока не выкладываю, появится позже, в платной версии.

3. В этом же файле, после строки

'T_STYLESHEET_NAME'		=> $user->theme['theme_name'],

добавьте строку

'SITE_ANTI_SPAM_JS'		=> getAntiSpanJavaScript(),

4. Тут же находим функцию request_var и сразу после открывающейся скобки пишем следующее:

	global $aAntiSpamVarNames;
	if( isset($aAntiSpamVarNames[$var_name]) ){
		$var_name = 	$aAntiSpamVarNames[$var_name];
	}

5. Переходим к шаблону. Открываем файл вашей темы под названием overall_header.hml и после строки

<script type="text/javascript">
// <![CDATA[

добавляем

{SITE_ANTI_SPAM_JS}

5. Теперь идем в файл overall_footer и переде тэгом </body> пишем следующее:

<script type="text/javascript">
myRewrite();
</script>

6. Теперь еще небольшая работа — делаем, чтобы bb-коды работали корректно с новыми именами полей. Открываем в папке с темой файл editor.js и первыми сроками пишем такую функцию:

function getTextarea()
{
	var doc;
	if (document.forms[form_name])
	{
		doc = document;
		return doc.forms[form_name].elements[RewritedMessageName];
	}
	else
	{
		return opener.document.getElementsByTagName('textarea')[0];
	}
}

Далее по коду, все конструкции типа

var textarea = doc.forms[form_name].elements[text_name];

заменяем на

var textarea = getTextarea();

Все. чистим кэш, проверяем работу. Приведенный тут пример корректно работает с темой aeroblue и вроде как subsilver. На других темах не проверял, но уверен, что проблем не будет.

Теперь плюсы данного способа:

1) Никакого неудобства пользователям, типа супер-сложной капчи или дополнительных полей.

2) Ни одного спам-комментария за 2 недели.

3) Легкая интеграция.

4) Защита как от автоматических регистраций так и от отправки сообщения.

Минусы:

1) Хрумер быстро научится обходить данную защиту как только она станет массовой, но он еще долго не сможет выполнить зашиврованный javascript о котором я писал выше.

2) Новые значения полей легко спарсить, но опять же пункт 1, фраза после запятой.

3) Не работает у тех, у кого отключен js, но это как мне кажется их проблема — с отключенным js читайте на здоровье, но писать, уж увольте.

Буду благодарен за ссылочку на мой блог с форума, который воспользуется данной технологией. Также планирую быстро сваять плагин для WP ибо, работающий сейчас у  меня, который создает чекбокс с дополнительным именем пробивается роботами, не сильно часто, но факт есть. Как вариант защиты, можно еще заказывать создание сайтов у профессионалов.

Эффективная борьба со спамом в phpBB3: 5 комментариев

  1. Хрумак как и весь черный СЕО явление пренеприятнейшее, но, увы, реальное. Мы им капчу, а они нам свои пути обхода.

    • Ну с данным решением пока проблем не было, а ставить очень сложную капчу э то лишнее неудобство пользователю

  2. Согласен, сильно сложная капча — зло. Обидно бывает накатать здоровый комментарий, а потом ошибиться при вводе капчи, да еще если текст не сохраняется.

  3. Здравствуйте!
    Есть небольшая корпоративная сеть, почта крутится на собственном почтовом сервере. Посоветуйте, плз, какое-нибудь решение для защиты от спама — в теме разбираюсь слабо, а делать надо 🙂

    • Тут я думаю немного не про то речь, вам скорее нужны фильтры, чем вот такие вот формочки 🙂

Обсуждение закрыто.