Skip to content

27. Januar 2012

5

Spammer, Webspell und Stopforumspam.com

Das CMS Webspell hat, wie so ziemlich jedes andere CMS auch, mit Spammern zu kämpfen. Der Clan myRevenge e.V. setzt Webspell ein und hat mich um Hilfe mit ihrem Spam Problem gebeten. Trotz Captcha und Bestätigungslink schaffen es Spammer immer wieder sich anzumelden oder als Gast zu spammen. Nach einer erfolgreichen Anmeldung wird im zweiten Schritt auch in Bereichen gespmamt, in denen Gäste keine Schreibrechte haben.

Um den Spam einzudämmen, bietet sich eine Überprüfung an, wer so schreibt. Dabei macht man sich zu Nutze, dass Spammer wiederkehrende E-Mail Adressen und Usernamen verwenden.

Im ersten Schritt werden unerwünschte Top Level Domains und Domainendungen in 2 Arrays übergeben und überprüft, ob die verwendete E-Mail einen dieser Kriterien entspricht. Weil Spammer sehr flexibel sind, stellt diese Maßnahme lediglich einen Tropfen auf den heißen Stein dar.

Wesentlich effizienter ist der zweite Schritt. Hier wird die API von stopforumspam.com kontaktiert und gefragt, ob Name, oder E-Mail bereits als Spammer bekannt sind. Stopforumspam.com ist eine Seite, die bekannte Spammer sammelt und nicht kommerziellen Nutzern eine API zu der Datenbank anbietet.
Nur wenn die API antwortet, dass der Datensatz unbekannt ist, darf der User sich anmelden, bzw. einen Kommentar schreiben.

Die beschriebenen Ergänzungen werden in den Dateien register.php und comments.php vorgenommen.

Die Erweiterung der register.php:

// check e-mail
if(!validate_email($mail)) {
	$error[]=$_language->module['invalid_mail'];
} else {
	// Liste mit unzulaessigen Maildomains
	$badmaildomains=array('willich.nicht','auchnicht.de');
	// Liste mit unzulaessigen TLs array('cn','xxx')
	$badtld=array();
	// Useraccount von Domain trennen
	list($user,$domain)=explode('@',$mail);
	// Top Level herausfinden
	$domain_explode=explode('.',$domain);
	$last_array_entry=count($domain_explode)-1;
	// Überpruefen, ob die Domain geblacklisted ist
	if (in_array($domain,$badmaildomains) or in_array($domain_explode[$last_array_entry],$badtld)) {
		$error[]=$_language->module['invalid_mail'];
	} else {
		// Stopforumspam kontaktieren:
		$opts=stream_context_create(array('http'=>array('method'=>'GET','header'=>"Accept-language: en\r\nUser-Agent: ".$_SERVER['HTTP_HOST']."\r\n")));
		$contact_stopforumspam=@file_get_contents('http://www.stopforumspam.com/api?email[]='.urlencode($mail).'&username[]='.urlencode($username).'&username[]='.urlencode($nickname),false,$opts);
		if($contact_stopforumspam!=false) {
			$xmlreply = simplexml_load_string($contact_stopforumspam);
			foreach ($xmlreply as $xml_key => $xmlcheck) {
				// Wenn der Spammer in der Datenbank erfasst ist, feststellen, ob die Mail und oder der Username bekannt war und einen entsprechenden Fehler ausgeben
				if ($xmlcheck->appears==1) {
					if ($xml_key=='email') {
						$error[]=$_language->module['invalid_mail'];
					} else if ($xml_key=='username') {
						$error[]=$_language->module['nickname_inuse'];
					}
				}
			}
		}
	}
}

Und die Änderung in der comments.php:

function IsNoSpammer ($mail,$username,$useragent) {
	$nospammer=true;
	// Liste mit unzulaessigen Maildomains
	$badmaildomains=array('willich.nicht','auchnicht.de');
	// Liste mit unzulaessigen TLs array('cn','xxx')
	$badtld=array();
	// Useraccount von Domain trennen
	list($user,$domain)=explode('@',$mail);
	// Top Level herausfinden
	$domain_explode=explode('.',$domain);
	$last_array_entry=count($domain_explode)-1;
	// Überpruefen, ob die Domain geblacklisted ist
	if (in_array($domain,$badmaildomains) or in_array($domain_explode[$last_array_entry],$badtld)) {
		$nospammer=false;
	}
	$opts=stream_context_create(array('http'=>array('method'=>'GET','header'=>"Accept-language: en\r\nUser-Agent: ".$useragent."\r\n")));
	$contact_stopforumspam=@file_get_contents('http://www.stopforumspam.com/api?email[]='.urlencode($mail).'&username[]='.urlencode($username),false,$opts);
	if($contact_stopforumspam!=false) {
		$xmlreply = simplexml_load_string($contact_stopforumspam);
		foreach ($xmlreply as $xml_key => $xmlcheck) {
			// Wenn der Spammer in der Datenbank erfasst ist, $nospammer auf false setzen
			if ($xmlcheck->appears==1) {
				$nospammer=false;
			}
		}
	}
	return $nospammer;
}
if (IsNoSpammer($mail,$name,$_SERVER['HTTP_HOST'])==true) {
	// hier den DB Eintrag vornehmen.
} else {
	die();
}
Read more from PHP
5 Comments Post a comment
  1. Losty
    Mrz 14 2012

    Hallo :)

    Danke für die Antwort schonmal. Ich stelle/stellte mir diese Frage weil ich mich bspw. mit einer Mail @willich.nicht trotzdem registrieren konnte.

    Ich hätte jetzt gedacht, dass diese Mailadressen ausgeschlossen werden würden wenn ich diesen Code nutze.

    Antworten
  2. Losty
    Mrz 6 2012

    Muss ich an den beiden Codes noch was ändern? Bin ziemlicher Anfänger was das angeht.

    Also bspw.

    // Liste mit unzulaessigen Maildomains
    // Liste mit unzulaessigen TLs array(‘cn’,'xxx’)

    oder sonst irgendwelche Dinge? :/

    Antworten
    • Ulrich Block
      Mrz 12 2012

      An der Stelle kann man bestimmte Länderendungen sperren. Wenn man z.B. keine User aus Russland hat, die Bots aber alle russische Mailadressen haben, sind sie sehr leicht auszusperren.

      Wenn man China, Russland und die Ukraine aussperren möchte, dann trägt man in das Array halt ein:
      $badtld=array(‘cn’,’ru’,'ua’);

      Antworten
  3. Ali
    Jan 28 2012

    Ich habe sie bei uns immer per MySQL Querry gelöscht.. Da sie stunden für ca. 200 Posts brauchen und ich nur ein Querry :D Jetzt lassen sie das :D

    NEWS BEITRÄGE DER USER LÖSCHEN
    DELETE FROM `DATENBANK`.`DEINPREFIX_comments` WHERE `DEINPREFIX_comments`.`userID` = USERID

    NEWS BEITRÄGE DER GÄSTE LÖSCHEN
    DELETE FROM `DATENBANK`.`DEINPREFIX_comments` WHERE `DEINPREFIX_comments`.`userID` = 0

    FORUM POSTS DER USER LÖSCHEN
    DELETE FROM `DATENBANK`.`DEINPREFIX_forum_posts` WHERE `DEINPREFIX_forum_posts`.`poster` = USERID

    Antworten
  4. myR|Noir
    Jan 27 2012

    vielen dank

    Antworten

Share your thoughts, post a comment.

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments