PHP: Spamerkennung für (Kontakt-)Formulare

Immer wieder werde ich nach Lösungen gefragt, wie man die Eingabe von Spam in Formulare vermeidet. Nun, die Eingabe lässt sich nicht vermeiden, wohl aber die Weiterverarbeitung. Die folgenden Funktionen sind in der Skriptsprache PHP realisiert. Die Anwendung ist relativ einfach: rufen Sie die Funktion 

function ftx_is_spam($str, 1);

auf, damit die Verarbeitung abgebrochen wird und der Benutzer eine Fehlermeldung erhält.

Ein Aufruf mit:

function ftx_is_spam($str , 0);

gibt true oder false zurück, was sich auswerten lässt. Ein Abbruch erfolgt dann nicht.

function ftx_is_spam($str, $exit=false) {

  # 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';

  ####### 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);
    }
    if (preg_match('/'.$strMuster.'/',  $str)) {
      if ($exit) {
        ftx_SpamdetectDie();
      } else {
        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:<p>
  <p>Gehen Sie zur&uuml;ck gegen 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%20gegen%20
  Sie%20weniger%20Urls%20ein%2C%20vermeiden%20Sie%20Begriffe%20wie
  %20viagra%20etc.">
  Translate this for me.</a>
</html>
  ');
}

Weitere Informationen in diesem Bereich: