Jörg Reinholz: Spamschutz ohne Captcha

Beitrag lesen

wir haben hier ein Formular gefunden, über das der User a.d. Website Mails versenden kann. Das Formular hat ein Skript entdeckt, dass nun damit anfängt, Spam zu versenden.

Definiere "elegant".

Ich habe kaum Probleme mit Spam aus meinem Formular.

Kontaktformular wird von Suchmaschinen ignoriert, aber in der robots.txt nicht konkret genannt. Es hat bewusst auch keinen der klassischen Namen.

Ich habe einen, eigentlich recht primitiven aber ergänzungsfähigen und über die Jahre optimierten Spamfilter, der die Nachricht untersucht:

<?php
function ftx_is_spam($str) {

	# Muster: Eintrag beginnt mit Link:
	$arMuster[]='^http:\/\/';
	$arMuster[]='^<a href';
	$arMuster[]='^\[url=';
	#3 Links:
	$arMuster[]='http:\/\/.*http:\/\/.*http:\/\/';
	
	#5 Sonderzeichen aufeinander
	$arMuster[]='&#[0-9A-F]{2,3};&#[0-9A-F]{2,3};&#[0-9A-F]{2,3};&#[0-9A-F]{2,3};&#[0-9A-F]{2,3};';
	
	#Spam-Begriffe
	$arMuster[]='tramadol]';
	$arMuster[]='viagra';
	$arMuster[]='cialis';
	$arMuster[]='prozac';
	$arMuster[]='pharmacy';
	$arMuster[]='fluotextine';
	$arMuster[]='charts';
	$arMuster[]='investing';
	$arMuster[]='cheap';
	$arMuster[]='sacher[- ]finanz';
	$arMuster[]='thepowerlevel.com';
	$arMuster[]='well-racking.com';
	$arMuster[]='hcracking.com';
	$arMuster[]='doxyciline';
	$arMuster[]='investment';
	$arMuster[]='trading';
	$arMuster[]='profit';
	$arMuster[]='dollars';
	$arMuster[]='farming';
	$arMuster[]='watches';
	$arMuster[]='replica';
	$arMuster[]='gucci';
	$arMuster[]='click here';
	$arMuster[]='stock price';
	$arMuster[]='trading software';
	$arMuster[]='your profit is fully maximized';

	# excec!
		
	$replace['i']='########I#######';
	$replace['l']='########I#######';
	$replace['o']='########O#######';
	$replace['a']='########A#######';
	$replace['c']='########C#######';
	$replace['z']='########C#######';
	
	$replace['########I#######']='[il1]';
	$replace['########O#######']='[o0]';
	$replace['########A#######']='[a@]';
	$replace['########C#######']='[czxs]';
	
        $str=trim(strtolower($str));
        $arKeys=array_keys($replace);
	
	foreach ($arMuster as $strMuster) {
	        foreach ($arKeys as $key) {
	             $strMuster=str_replace($key, $replace[$key], $strMuster);
	        }
	        #echo "preg_match('/'$strMuster'\/', $str)\n";
		if (preg_match('/'.$strMuster.'/',  $str)) { ftx_SpamdetectDie(); return true; }
	}
	return false;
}

function ftx_SpamdetectDie() {
	header("HTTP/1.0 403 Forbidden",true,403);
	die('
<html style="margin:20%">
	<h1>Spam erkannt!</h1>
	<p>Falls Sie nicht zu spammen versuchten: Gehen Sie zur&uuml;ck, geben Sie weniger Urls ein, vermeiden Sie Begriffe wie Viagra etc.<p>
	<p><a href="http://translate.google.de/#de/en/Spam%20erkannt!%0A%0AFalls%20Sie%20nicht%20zu%20spammen%20versuchten%3A%20Gehen%20Sie%20zur%C3%BCck%2C%20geben%20Sie%20weniger%20Urls%20ein%2C%20vermeiden%20Sie%20Begriffe%20wie%20viagra%20etc.">Translate this for me.</a></a>
</html>
');
exit;
}
  1. Die regelmäßig primitiven Bots können weder JS noch CSS. Die füllen auch "blinde" Felder aus. Das kann man ausnutzen in dem man $_POST['hier_darf_nichts_stehen'] auf Inhalt untersucht.

Das genügt Denn die Spammer wollen ja kein Geld ausgeben. Die suchen sich, weil das billiger ist, Idioten, die den Stuff aus Matt's Skript-Archiv benutzen.

Jörg Reinholz