Gästebuch-Spam verhindern - PHP Spamfilter

Gästebuchspam verhindern






Artikel erschienen am

Gästebuch-Spam verhindern - PHP-Tipps für Spam-FilterMehr Infos



  1. Kleine (oder doch große?) Vorgeschichte :
    Wie schön waren noch die Anfangszeiten dieser Website im Jahr 2002. Ein kleines, völlig einfaches Gästebuchskript, welches nur erwünschte Einträge enthielt. Gästebuch-Spam kannte ich damals noch gar nicht. Das Gästebuch lief fast ein Jahr, ohne dass ich in irgendeiner Weise hätte eingreifen müssen. Völlig unmoderiert. Gut, da war vielleicht mal ein Eintrag eines Witzboldes mit dem Inhalt "Schei*e" oder ähnlich, aber nichts, was mich aus der Ruhe brachte.
    Ehrlich gesagt, hätte ich damals auch noch gar nichts gegen Spam ausrichten können, denn die Bedeutung der 3 Buchstaben PHP waren mir zu dieser Zeit noch gar nicht bewusst.

    Wenn es jetzt so friedlich wie damals weitergelaufen wäre, würdet Ihr diesen Text hier gar nicht lesen können, denn ich hätte ihn niemals verfasst.
    Ich freute mich also Anfang 2003 über immer mehr Besucher auf meiner Website, und natürlich gab es auch immer mehr Gästebucheinträge. Da meine Website zweisprachig ist, wunderte ich mich auch nicht sonderlich über immer häufiger auftretende englischsprachige Einträge.
    Nur fiel mir irgendwann mal auf, dass viele Gästebucheinträge recht kurz gehalten waren, und oft waren sie auch sehr gleichlautend. Eigentlich hatten diese Einträge gar nichts Konkretes mit meinem Angebot zu tun. Es hiess dann immer so ähnlich wie "Great Site ... Please visit my site, too..".
    Ich folgte dann immer häufiger mal den LinksMehr Infos, die diese "Besucher" unter HomepageMehr Infos eingetragen hatten. Es waren ausschliesslich kommerzielle Seite, thematisch meist mit Themen und Mittelchen für "unter die Gürtellinie" gedacht.
    Der Gästebuch-Spam war also da. Und wie er da war. Alle paar Tage kamen dann weitere Spam-Einträge hinzu, welche ich mühsam von Hand aus dem Gästebuch entfernen musste. Immerhin besuchen auch KinderZur Bildergalerie meine Naturfotografie-Seite. Da ist es nicht vertretbar, wenn Gästebuch-Spam längere Zeit im Gästebuch zu sehen ist (eigentlich nicht mal für eine Sekunde).
    Anfang 2004 setzte ich mich dann auch mal mit dem Thema PHP auseinander. Die ganze Seite wurde neu gestrickt. Aber ans Gästebuch dachte ich da noch nicht. Immer noch fleissig löschte ich jetzt mehrmals täglich Spams. Fast ein Fulltime-Job.

    Als der Fulltime-Job dann fast zum Fulltime-Job für 2 Personen wurde und meine PHP-Kenntnisse etwas über die Grundkenntnisse hinausgewachsen sind, nahm ich mir vor, dem Spam, der mir so viele kostbare Stunden meines erbärmlichen Lebens gekostet hat, den Garaus zu machen.

    Kann doch kein Problem sein, dachte ich. Das erste was ich tat, war eine kleine Black-Word-List zu erstellen, die hauptsächlich vulgäre Ausdrücke und etliche Medikamentennamen enthielt.
    Es half, aber noch immer rutschte - wenn auch weniger - Gästebuch-Spam hindurch. Klar, es kommen regelmässig neue Medikamente hinzu, und teilweise wurden die Medikamentennamen einfach in der Schreibweise etwas gefälscht, so dass meine Blacklist diese nicht mehr erkannte.
    Ich erweiterte als fast täglich die Blacklist, und löschte die Einträge, die trotz der Blacklist durchgerasselt sind, per Hand.
    Ähm... wie war das noch... wollte ich mir mit Hilfe der Blacklist nicht arbeit ersparen ?? Jetzt hatte ich also doppelt zu tun...
    Hat man aber erstmal eine gute Blacklist aufgebaut, und wirklich die relevanten Begriffe drinnen, dann sah die Sache schon etwas besser aus. Eigentlich lief es mit ca. 4000 Begriffen in der Blacklist schon ganz gut (bitte nicht lachen über die 4000 Begriffe, ich war seinerzeit richtig besessen von der Idee, mittels Blacklist jeglichen Spam zu bekämpfen).

    Während über die Blacklist jetzt fast jeglicher Spam gefiltert wurde, liess mich die Spam-Sache irgendwie trotzdem nicht in Ruhe. Ich war jetzt Anti-Spam-Virus besessen.

    Also bastelte ich weiter. Es musste doch möglich sein, aufgrund anderer Kriterien, Spam von normalen Einträgen zu unterscheiden. Ich überlegte, schaute nach weiteren Auffälligkeiten am Spam usw...
    Und langsam aber sicher, hatte ich so viele andere Dinge, die überprüft werden, dass die Blacklist an sich gar nicht mehr gebraucht wurde (aber zur Sicherheit immer noch im Hintergrund läuft).

    Da ich cool sein wollte, gab ich meinem Konstrukt dann auch noch einen bekloppten Namen - NFD Spam Protect V1.0Mehr Infos - und fühlte mich so, als wenn ich ein richtiger Programmierer wäre. Bitte lasst mich in dem Glauben ;-)
    NFDMehr Infos steht übrigens für Naturfotografie-Digital ;-)

    Also dieses kleine Programm, NFD Spam Protect V1.0Mehr Infos, verhinderte jetzt eigentlich zu 100% Spam. Es kam nichts mehr durch. Zusätzlich zeigt es im Gästebuch die geblockten Spams an, und schickt mir Mails mit Einträgen, wo es sich nicht ganz sicher ist. Also wenn beispielsweise nur ein Spam Kriterium erfüllt ist. Falls ein Eintrag also versehentlich blockiert wurde, konnte ich in immer noch per Hand freischalten.
    Auch das Verhältnis Spam zu normalen Gästebucheinträgen wird angezeigt. Ach was erzähl ich, schaut Euch das Gästebuch einfach an, und schaut unter dem Formular.

    Jeder halbwegs normale Mensch würde jetzt absolut glücklich mit dieser Lösung sein. Ich hatte absolut keinerlei Arbeit mehr mit Gästebuchspam, und das ohne Captchas oder andere für den Besucher lästige Dinge einzubauen.
    Aber erstens bin ich nicht normal und zweitens war ich besessen vom Kampfgeist. Als ich sah, dass der SpamfilterMehr Infos pro Tag ca. 700 Spam-Einträge blockierte, wollte ich wieder handeln.
    Als erstes fragte ich mich, wieso kommen bei mir so viele Spam Einträge, und bei einem Freund, der sein Gästebuch "erst" seit 3 Monaten Online hat so wenige. Auch sein Gästebuch ist in den Suchmaschinen zu finden.
    Die Spammer haben anscheinend riesige Listen mit URLS die wahrscheinlich unregelmäßig aktualisiert werden. Je länger man also mit seinem Gästebuch Online ist, auf so mehr Listen befindet man sich dann mit seinen Gästebuch-Urls.
    Hmm... um also einen Großteil automatisierten Spams abzuweisen, genügt es also, regelmäßig die URLs des Gästebuchs und der Eintragsseite zu ändern. Das kann man auch bei Bedarf automatisch erledigen lassen.
    Geboren war mein NFD Bot-FlustererMehr Infos ;-).
    Das gute Stück tut also nichts anderes, als die Bots mit falschen URLs zu füttern, denn sobald diese das Gästebuch versuchen mit Spam zu füttern, stimmt diese schon nicht mehr.
    Die Archive der Spammer haben also in bezug auf mein Gästebuch keinen Sinn mehr.... :-)

    Und nun bin ich - vorerst - wirklich zufrieden. Bis zum SpamfilterMehr Infos kommt jetzt nur noch ca. 1 (anstatt vorher 700) Spam täglich zum SpamfilterMehr Infos durch. Die anderen Spameinträge landen irgendwo im Nirvana...

  2. Lösungen in PHP
    Im Folgenden werde ich einige meiner Lösungen, welche in meinem Gästebuch zum Einsatz kommen, kurz erläutern. Vorraussetzung sind gute PHP Grundkenntnisse.
    Vielleicht holt sich ja auch der eine odere andere Sapmmer hier ein paar Informationen, umgeht dann meine Tricks, und gibt mir wieder neue Rätsel auf ;-)

  • Blacklist oder Bad Word List
    Spam anhand von Worten oder ganzen Sätzen zu erkennen, ist eine recht gute Methode, wenn man erstmal einen recht großes Archiv zusammengestellt hat.
    Am besten Du stellst Dir eine Datenbank, oder auch eine Textdatei zusammen, mit sämtlichen spamverdächtigen Worten oder Sätzen.
    Stelle Dir die Liste gleich so zusammen, dass Leerzeichen berücksichtigt oder nicht berücksichtigt werden können.

    So etwa in dieser Art :

    ; Arsch;
    ; sex ;

    Sucht mittels php nun die Einträge nach den Begriffen in der Liste ab, pro gefundenes Wort lasst ihr einen zaehler mitlaufen, meinetwegen $spam++; , wenn ein Begriff gefunden wurde.
    Wenn Ihr einen Begriff in der Liste habt, der 100%ig auf Spam hindeutet, könnt Ihr Ihn ja auch doppelt in der Liste platzieren, damit er doppelt gezählt wird (sicher gibt es da auch komfortablere Möglichkeiten, aber nur so als Beispiel).
    Ist $spam am Ende bspw. grösser als 2, dann ist die Wahrscheinlichjkeit, dass es sich um Spam handelt, doch recht gross, und der Eintrag kann blockiert werden.

    <?
    //$kommentar, $name; $email, $homepage etc.
    //wird von der Formularseite übergeben
    //Die Blacklist liegt in diesem Fall als Textdatei
    //auf dem Server vor (blacklist.txt).

    $fp = fopen ("blacklist.txt", "r");

    $blacklist = fread ($fp, 200000);

    fclose ($fp);


    //Da unsere Blacklist.txt Datei aufgebaut ist, wie ich oben
    //im Text beschrieben habe, muss Sie erst aufbereitet werden.
    //Im Endeffekt stehen die Bad Words dann einzeln
    //im Array $badword , inkl. der Leerzeichen falls vorhanden.

    $blacklist = str_replace ("\r\n","", $blacklist);

    $blacklist = str_replace ("\r","", $blacklist);

    $blacklist = str_replace ("\n","", $blacklist);

    $blacklist = str_replace (";;",";", $blacklist);


    //Jetzt noch schnell eventuelle Tippfehler bzgl der Semikoli
    //oder Leerzeichen in Eurer Blacklist korrigieren. Zur
    //Sicherheit... :

    while((substr_count($blacklist,";;")>0)||(substr_count($blacklist,"  ")>0))

      {

       $blacklist = str_replace (";;",";", $blacklist);
    //dann entfernen
       $blacklist = str_replace ("  "," ", $blacklist);
    //dann entfernen
      }


    $badword = explode (";",$blacklist);
    //Wörter sind jetzt in Array $badword
    $badwords = count($badword);
    //Anzahl der Wörter in $badword

    //Und jetzt wirds chaotisch (ja noch mehr)
    //Ich mische einfach nur für die Spamprüfung
    //alle durch das Formular übergebenen
    //Datenfelder zusammen. Aus dem $homepage
    //entfernen wir noch ein eventuelles http://
    //und schreiben es in $website

    $website = str_replace ("http://","", $homepage);

    $eintrag = " ".$name." ".$email." ".$land." ".$homepage." ".$kommentar." ";


    //Nun entferne ich aus dem $eintrag sämtliche
    //Sonderzeichen (heisst nur die gewünschten
    //Zeichen bleiben)

    $erlaubte = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    ."abcdefghijklmnopqrstuvwxyz"

    ."ÄÖÜßäöü 0123456789=";


    //Ihr seht, also kein Satzzeichen etc. ist mehr gewünscht.
    //Wir wollen nur die wirklichen Worte für unseren
    //Filter haben. Und das =-Zeichen. Warum? Dazu
    //später !

    $anz2 = strlen($eintrag);

    for ($i=0; $i<$anz2; $i++)

      {

       $zeichen = substr ( $eintrag, $i, 1 );

       $c= substr_count($erlaubte, $zeichen);

            if ( $c < 1 )

             {

              $eintrag = str_replace ( $zeichen, " ", $eintrag);

             }

       }


    //Eintrag von aneinandergereihten Leerzeichen befreien

    while ( substr_count ( $eintrag, "  ") > 0 )
    //wenn mehrfache leerzeichen<
      {

       $eintrag = str_replace ("  "," ", $eintrag);
    //dann entfernen
      }


    echo "<pre>".$eintrag."</pre><br>";
    //Wird nachher entfernt, nur damit
    //Ihr seht, wie der eintrag aufbereitet wird ;-)

    //Wir haben jetzt also einen absolut sauberen Gesamteintrag, ohne
    //Sonderzeichen, Wort für Wort sauber durch Leerzeichen getrennt.
    //Jetzt kann die Filterfunktion viel besser und sauberer mit
    //dem Eintrag umgehen

    //Nun die eigentliche Filterfunktion (die zu Spamverdächtigen Wörter
    //stehen jetzt ja in dem Array $badword die Anzahl der Spamverdächtigen
    //steht in $badwords

    $filtered = 0; $gefiltert ="";

    for ($wortnr = 1; $wortnr < $badwords-1; $wortnr++)

      {

       $wort = $badword[$wortnr];

       echo $wortnr." :’".$wort."’<br>";

       if ( ($t = preg_match("/($wort)/i", $eintrag)) && (strlen($wort)>1) )

          {

           $filtered++;

           $gefiltert = $gefiltert.$wort."<br>";

          }

      }


    //Der Eintrag wurde jetzt auf die Wörter in unserer Blacklist untersucht
    //in $filtered steht die Anzahl der gefundenen Blackwords
    //in $gefiltert stehen die Wörter selbst (nur für den Fall, dass Ihr das
    //kontrollieren wollt, was der Filter da gemacht hat ;-)

    //Jetzt wird entschieden, ob der Eintrag aufgenommen wird, oder ob
    //(in diesem Fall bei 2 Treffern) geblockt wird.

    if ($filtered > 1)

      {

       echo "<br><b>Ihr Eintrag ist Spamverdächtig und wurde blockiert...</b>";

       echo "<br>Anzahl Spamkriterien :".$filtered;

       echo "<br>Folgende Worte verursachten den Spamverdacht :<br><br>".$gefiltert;

      
    //P.S.: Die Ausgabe der gefundenen Spamworte sollten natürlich nicht
      
    //im richtigen Gästebuch zu sehen sein. Ihr könnt Euch die Worte und andere
      
    //Daten zum Eintrag aber natürlich vom Server per Mail zuschicken lassen
      
    //um den Filter zu beobachten - ob er auch wunschgemäß arbeitet.
      }

      else

      {

       echo "<br>Vielen Dank für Ihren Eintrag.<br>Der Eintrag war erfolgreich.";

      
    //Hier würde jetzt der Code für den Eintrag erfolgen...
      
    //......
      
    //......
      
    //......
      }

    ?>

    Die dazugehörige Blacklist (in diesem Fall eine Textdatei mit dem Namen blacklist.txt müsst Ihr dann natürlich auf Eurem Server abspeichern. Ein anderer Dateiname empfiehlt sich natürlich.
    Jedes Wort in der Blacklist für dieses Script kommt in eine eigene Zeile. Und jedes Wort ist durch zwei Semikolon begrenzt. Das Script filtert auch Wortbruchstücke, wenn Ihr das Wort direkt zwischen die Semikolon platziert.
    Bsp.: ;arsch;
    Auch Wort wie Barsch, Barschel, etc. würden hier gefiltert werden.
    Bsp.: ; arsch ;
    Filtert wirklich nur "arsch".

    Bsp.: ;arsch ;
    Filter zwar Barsch, aber nicht Barschel.

    Und so weiter. Also Ihr konnt also gezeilt die Begriffe einsetzen. Zur Verdeutlichung einmal die Datei blacklist.txt , wie sie für dieses Script verwendet wurde :

    ;medikament1;
    ;medikament2;

    ;medikament3;

    ;zepam ;

    ; porn ;

    ; Arsch;

    ;a href=;

    ;href=;

    ; http ;

    ; dosage ;

    ;overdose;

    ;sideeffect;

    ;www muster de ;

    ;naturfotografie digital de;

    ; url= ;

    ; url ;




    Mit dieser kleinen Blacklistdatei hättet Ihr übrigens schon 90% des Spams herausgefiltert, Aufgrund der Ausdrücke "href=" " href " " url " etc... !
    Bedenkt, dass, wenn Ihr Domainnamen angebt, diese auch in der Blacklist ohne Punkte oder Slashes schreibt, da diese nicht berücksichtigt werden.

    Zur Übersichtlichkeit den Programmcode nochmal ohne die vielen Erläuterungen und Kommentare, direkt zum Kopieren. Könnt Ihr gerne so verwenden.

    Blacklist-Blocker :


    <?
    //BLACKLIST-BLOCKER $kommentar, $name; $email,$land, $homepage etc. von Formularseite erwartet

    $fp = fopen ("blacklist.txt", "r");$blacklist = fread ($fp, 200000);fclose ($fp);

    $blacklist = str_replace ("\r\n","", $blacklist);$blacklist = str_replace ("\r","", $blacklist);

    $blacklist = str_replace ("\n","", $blacklist);$blacklist = str_replace (";;",";", $blacklist);

    while((substr_count($blacklist,";;")>0)||(substr_count($blacklist,"  ")>0))

      {

       $blacklist = str_replace (";;",";", $blacklist);
    //Doppelsemis weg
       $blacklist = str_replace ("  "," ", $blacklist);
    //Doppelspaces weg
      }

    $badword = explode (";",$blacklist); $badwords = count($badword);


    $website = str_replace ("http://","", $homepage);

    $eintrag = " ".$name." ".$email." ".$land." ".$homepage." ".$kommentar." ";


    $erlaubte = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"."abcdefghijklmnopqrstuvwxyz"."ÄÖÜßäöü 0123456789=";

    $anz2 = strlen($eintrag);
    //Sonderzeichen entfernen
    for ($i=0; $i<$anz2; $i++)

      {

       $zeichen = substr ( $eintrag, $i, 1 ); $c= substr_count($erlaubte, $zeichen);

            if ( $c < 1 )

             {

              $eintrag = str_replace ( $zeichen, " ", $eintrag);

             }

       }


    while ( substr_count ( $eintrag, "  ") > 0 )
    //Doppelspaces weg
      {

       $eintrag = str_replace ("  "," ", $eintrag);
    //Doppelspaces weg
      }


    $filtered = 0; $gefiltert ="";
    //Der Filter beginnt
    for ($wortnr = 1; $wortnr < $badwords-1; $wortnr++)

      {

       $wort = $badword[$wortnr];

       echo $wortnr." :’".$wort."’<br>";

       if ( ($t = preg_match("/($wort)/i", $eintrag)) && (strlen($wort)>1) )

          {

           $filtered++; $gefiltert = $gefiltert.$wort."<br>";

          }

      }

    if ($filtered > 1)
    //Bei mehr als 1nem Wort wird geblockt
      {

       echo "<br><b>Ihr Eintrag ist Spamverdächtig und wurde blockiert...</b>";

       echo "<br>Anzahl Spamkriterien :".$filtered;

       echo "<br>Folgende Worte verursachten den Spamverdacht :<br><br>".$gefiltert;

      }

      else

      {

       echo "<br>Vielen Dank für Ihren Eintrag.<br>Der Eintrag war erfolgreich.";

      }

    ?>

    Eins vielleicht noch : Wenn Ihr Worte doppelt in die Blacklist eingebt, dann werden diese auch doppelt gewichtet. "href=" und "href =" schreien förmlich danach, doppelt gewichtet zu werden :-) .

  • Formularfelder vergleichen
    Formularfelder werden von den Spambots automatisch ausgefüllt. Häufig sind, wenn mehrere Formularfelder vorhanden, die Einträge absolut gleich.
    Beim Herkunftsland wird häufiog erneut der Name oder die E-MailMehr Infos eingetragen usw.
    Sobald also zwei Formularfelder den gleichen Inhalt haben, können wir eigentlich davon ausgehen, dass es sich um Spam handelt.
    Ein kleines Script überprüft dies :

    <?
    //Formularfelder vergleichen, wenn zwei Felder gleich, dann
    //handelt es sich wahrscheinlich um Spam.
    //$homepage,$land,$email,$name,$kommentar wurden übergeben

    if ( ($homepage != "") && ( ($homepage == $land) || ($homepage == $email) || ($homepage==$name) || ($homepage == $kommentar) ) )

        {

        $filtered++;

        }

    if ( ($name != "") && ( ($name == $land) || ($name == $email) || ($name == $kommentar) ) )

        {

        $filtered++;

        }

    if ( ($land != "") && ( ($land == $email) || ($land == $kommentar) ) )

        {

        $filtered++;

        }


    if ( ($email != "") && ( ($email == $kommentar) ) )

        {

        $filtered++;

        }

    ?>



  • Länge des Kommentars
    Die Länge des Kommentars sollte schon paar Buchstaben betragen. Wenn Kommentare nur aus weniger als 10 Buchstaben bestehen, dann steht wortwörtlich nicht viel mehr als "Schei*e" drin.

    <?
    //$kommentar, $name; $email,$land, $homepage etc.
    //von Formularseite erwartet

    if ( strlen($kommentar) < 10 )

       {

        $filtered++;

       }

    ?>

    Hier, wie auch im vorherigen Beispiel, wird die Varuable $filtered immer um eins erhöht. Am Ende (wie schon im Blacklist-Code gezeigt), wird dann anhand der Höhe der Spam-Anahltspunkte entscheiden, ob der Beitrag freigeschaltet wird oder nicht.
    Auch in den folgenden Beispielen werde ich nur $filtered erhöhen, wenn ein Spamkriterium vorliegt.


  • IP-Adressen vergleichen
    Öfters ändert sich bei den Robots die IP-Adresse von der Formularseite zur Hinzufügen-Seite.
    Man kann dies natürlich auch checken, sollte aber bedenken, dass dies auch bei Privatsurfern der Fall sein kann. Man sollte dann lieber grob nur den vorderen Teil der IP-Checken...


  • Prüfen, ob der "Einträger" wirklich auf der Seite war...
    Diese Prüfung entlarvt recht häufig Spammer, denn diese werden sich kaum vorher Eure Seite anschauen. Aber auch hier gilt leider, dass schon einige Bots diese Hürde überwinden. Die Masse an Überprüfungen macht letztendlich aber nachher die Sicherheit Eures SpamfiltersMehr Infos aus...
    Um den Referrer zu überprüfen, fragt diesen einfach schon auf der Formularseite ab und reicht Ihn, wenn Ihr wollt auch verschlüsselt, später an die Eintragsseite weiter.
    Hier das Script, welches Ihr schon ganz oben auf der Formularseite platzieren könnt :

    <?
    //Dieses Script bitte auf der Formularseite einfügen
    //und die Variable $weiter an die Eintragsseite
    //im hidden Formularfeld übermitteln.

    $woher= ($_SERVER[’HTTP_REFERER’]);

    if (substr_count($woher, ’www.muster.de’) == 1)

       {

       $weiter= "OK";

       }

       else

       {

       $weiter= "NO";

       }


    //$weiter muss im Formular dann später aber auch per $post an die
    //Hinzufügen-Seite weitergegeben werden
    //www.muster.de steht für Euren Domainnamen. Wenn das Gästebuch von
    //allen Euren Unterseiten angeklickt werden kann, ist dies die
    //einfachste Lösung (aber auch unsicherste).
    //Ihr könnt natürlich alle Eure Seiten, von denen es angeklickt
    //werden kann, einzeln abfragen. Das wäre sicherer...
    //Da die Bots oft als Referrer die aktuelle Seite angeben, könnt Ihr dies
    //wenn gewünscht noch absichern. Ein Besucher, der dann aber auf dem Gästebuch
    //den Reload Button drückt, wird dann leider auch gesperrt.
    //Hier Code dazu :

    if (substr_count($woher, ’www.muster.de/euergaestebuch.php’) == 1)

       {

       $weiter= "NO";

       }

    ?>



    Auf der Hinzufügen-Seite überprüfen wir jetzt, die $weiter-Variable. Zusätzlich schauen wir, ob der Bot auch hier den richtigen Referrer von der Formularseite übergeben hat.
    Wir prüfen also einmal, ob der Referrer, welcher der Formularseite übergeben wurde, stimmt. Und zusätzlich prüfen wir, ob der aktuelle Referrer, welcher der Hinzufügen-Seite übermittelt wurde, stimmt. Der muss nämlich von der Formularseite stammen !!

    <?
    //Dieses Script bitte auf der Hinzufügen-Seite einfügen
    //Referrer Check
    if ($weiter != "OK")

       {

       $filtered++;
    //Prüft ob von der Formularseite ein OK
                    
    //übermittelt wurde
       }


    $akt_referrer =($_SERVER[’HTTP_REFERER’]);


    if ( substr_count($akt_referrer, ’www.muster.de/formularseite.php’) != 1 )

       {

       $filtered++;
    //Wenn Referrer nicht von Formularseite
                    
    //dann blockieren...
       }

    ?>

    Mit den jetzigen Überprüfungen haben wir schon deutlich mehr als 90% des Spams geblockt. Sowohl manuellen (mit Hilfe der Blacklist, die Du ja soweit erweitern kannst, dass alleine die Blacklist schon fast 100% schafft), also auch den Robot-Spam, der ja wieder andere Besonderheiten aufweist.


  • Kommentarfeld $kommentar noch genauer prüfen
    Die generelle Prüfung haben wir ja schon mit Hilfe der Blacklist erreicht. Sachen wie www oder ".com" können wir damit aber nicht herausfilterm, da im dortigen Programm ja auch das $homepage-Feld berücksichtigt wird.
    Dies kann man aber nachträglich noch problemlos erledigen,
    mit folgendem Code :

    <?
    //Bitte auf die "Hinzufügen"-Seite einbauen
    //Kommentarfeld überprüfen
    $blocker = ".com ;.COM ;WWW.;www.;[URL];[url];.COM/;.com/;.html;.HTML;.php;.PHP";

    $blockers = explode (";",$blocker);

    $k = count ($blockers);


    for ($i =0; $i < $k; $i++)

       {

       if ( substr_count($kommentar, $blockers[$i]) > 0 )

          {

          $filtered++;

          }

       }

    ?>



    In die Variable $blocker kannst Du jetzt natürlich noch weiteres einfügen. Aber im Grunde genommen reicht das schon aus, den Rest erledigt dann ja eh die Blacklist...
    Nun haben wir nahezu 100% des Spams aus unserem Gästebuch ferngehalten !!


  • Schnelltipper mit 100-Finger-System ;-)
    Sucht man im Internet nach Tricks, um Spam zu vermeiden, liest man häufig, dass die Spambots den Eintrag Millisekunden verfassen. Das ist heutzutage aber in den meisten Fällen nicht mehr ganz zutreffen. Die Spambots haben dazugelernt, und täuschen längere Zeiten vor. Häufig auch Zeiten von über eine Stunde. Anstatt jetzt, wie oft vorgeschlagen, einfach nur die Zeit des Dauer des Eintrages zu kontrollieren, würde ich noch einen Schritt weitergehen, und die Tippgeschwindigkeit (also Anschläge pro Sekunde) checken.
    Eine gute Methode, viele Bots (oder auch handspammer, die per Drag & Drop arbeiten) zu blockieren.
    Einige Bots überqueren diese Hürde bereits, aber immer noch viele scheitern. Also lohnt es sich, auch diese Hürde noch mit einzubauen.
    Hier der Code :

    <?

    //Dieses Script auf der Formularseite einfügen

    $zeiti = time(void);


    //$zeiti dann im Formular in  einem hidden Feld
    //übermitteln.
    //Ihr könnt den Zeitstempel natürlich vorher etwas verändern
    //damit die Robots nicht dahinterkommen

    $zeiti = $zeiti*5.3 + 35468683956453430012345;


    //nicht vergessen, die "Verschlüsselung" auf der
    //"Hinzufügen"-Seite wieder rückgängig zu
    //machen

    ?>

    Hier nun das Script, welche den Anschlag berechnet, und wesentlich schnelle Einträge direkt abstraft. Ebenfalls werden Einträge, die länger als eine Stunde dauern, abgestraft :

    <?
    //Bitte auf der "Hinzufügen"-Seite einfügen
    //$zeiti wird von der Formularseite erwartet
    //und nicht vergessen Eure Verschöüsselung
    //rückgängig zu machen

    $aktzeit = time(void);
    //aktueller Timestamp
    $zeiti = (($zeiti - 35468683956453430012345)/5.3) ;

    $differenz = $aktzeit - $zeit;


    //Hab es schon gehabt, dass die Bots hidden-fields
    //einfach leergelassen und nicht übermittelt haben.
    //oder so schnell sind, das tatsächlich kein Unterschied
    //zu sehen.
    //Da dies in unserer Berechnung einen
    //Division by zero erzeugen würde, muss dies
    //verhindert werden. Also wenn die Differenz 0 ist,
    //auf 0.1 setzen...

    if ($differenz ==0) { $differenz = 0.1; }


    //Eintrag unterhalb von 2 Sekunden
    //wird 3-fach bewertet
    if ($differenz < 2)

       {

        $filtered = $filtered;

        }


    if ($differenz < 10)

       {

        $filtered++;

        }

    //Wenn der Eintrag unter 10 Skunden verfasst wurde,
    //ist er Spamverdächtig, bei unter einer Sekunde
    //doppelt Spamverdächtig (dann wird $filtered
    //2x erhöht, einmal bei <2 und einmal bei <10 Sek

    if ($differenz > 3600)

       {

       $filtered++;

      
    //Vorischtig sein,
      
    //es gibt Menschen, die sich wirklich
      
    //sehr viel Zeit für einen längeren
      
    //Gästebucheintrag nehmen.
      
    //Allerdings ist bei mir ein solcher
      
    //Eintrag bisher nur von Robots geschrieben worden
       }


    //Tastenanschläge pro Sekunde
    $gesamteintr = $name.$email.$land.$homepage.$kommentar ;

    //etc. je nachdem wieviele Gästebuchformularfelder Ihr habt
    //alle ein gesamteintr. schreiben

    $laengeeintrag = strlen ($gesamteintr);
    //Anschläge
    $charspersecond= $laengeeintrag/$differenz;
    //Anschl. pro Sekunde

    if ($charspersecond > 8)

      {

      $filtered++;
    //Einmal (innerhalb von 3 Jahren)hat es bei mir
      
    //bisher jemand geschafft
      
    //8 Anschläge pro Sekunde zu tippen. Dieser jemand muss
      
    //direkt auf die Formularseite gegangen sein, und gleich in
      
    //einem unglaublichen tempo auf die Tatstatur eingedroschen
      
    //haben. Zur Sicherheit könnt Ihr den Wert ja auf 9 oder 10
      
    //setzen.
      
    //ich konnte den Eintrag dank Mailbenachrichtig dann per hand
      
    //freischalten.
      
    //Robots tippen meist mit einer Geschwindigkeit größer 10
      
    //Anschläge pro Sekunde (wenn Sie denn einen Wert vortäuschen).
      
    //Meist um die 15-30 übrigens...
      
    //das schafft ein normaler Mensch schwer, wenn er sich noch die
      
    //Formularfelder anschaut, und überlegt, was er tippen soll...
      }


    ?>

    Den gleichen Code nochmal ohne meine nervigen Kommentare, direkt zu einfügen in Euer Script :

    <? //Für Hinzufügen-Seite / $zeiti erwartet von Formularseite

    $aktzeit = time(void);

    $zeiti = (($zeiti - 35468683956453430012345)/5.3) ;

    $differenz = $aktzeit - $zeit;

    if ($differenz ==0) { $differenz = 0.1; }

    if ($differenz < 2) { $filtered++; }

    if ($differenz < 10){ $filtered++; }

    if ($differenz > 3600) { $filtered++; }

    $gesamteintr = $name.$email.$land.$homepage.$kommentar ;

    $laengeeintrag = strlen ($gesamteintr);

    $charspersecond= $laengeeintrag/$differenz;

    if ($charspersecond > 8) { $filtered++; }


    ?>



  • Nicht gleich sofort löschen !
    In allen Beispielen habe ich jedesmal, wenn etwas auf Spam hindeutet, die Variable $filtered um 1 erhöht. Letztendlich ist es jetzt Deine Entscheidung, ab wieviel Kriterien Du den Eintrag als Spam abtust.
    Ich selber habe für mich die Möglichkeit gewählt, bei schon einem Kriterium die nachricht zu blockieren. Allerdings wird mir, wenn es insgesamt unter 5 Kriteren sind, eine Mail vom Server zugesendet, welche den Eintrag, die Anzahl der Kriterien (inklusive der Gründe) zusendet.

    Kleiner Tipp :
    Wenn Ihr es auch mit Mailbenachrichtung machen wollt, dann macht Euch noch eine Variable $grund , die Ihr dann immer auch dort erweitert, wo $filtered++; steht. Beispiel jetzt für die Anschläge pro Sekunde :

    <? //Für Hinzufügen-Seite / $zeiti erwartet von Formularseite

    $aktzeit = time(void);

    $zeiti = (($zeiti - 35468683956453430012345)/5.3) ;

    $differenz = $aktzeit - $zeit;

    if ($differenz ==0){ $differenz = 0.1; }


    if ($differenz < 2)

       {

        $filtered++;

        $grund = $grund."<br>Eintrag ist in weniger als 2 Sekunden gemacht worden";

        }


    if ($differenz < 10)

       {

       $filtered++;

       $grund = $grund."<br>Eintrag ist in weniger als 10 Sekunden gemacht worden";

       }


    if ($differenz > 3600)

       {

       $filtered++;

       $grund = $grund."<br>Für den Eintrag wurde mehr als 1 Stunde gebraucht.";

       }


    $gesamteintr = $name.$email.$land.$homepage.$kommentar ;

    $laengeeintrag = strlen ($gesamteintr);

    $charspersecond= $laengeeintrag/$differenz;


    if ($charspersecond > 8)

       {

       $filtered++;

       $grund = $grund."<br>Es wurde mit mehr als 8 Zeichen pro Sekunde getippt.";

       }


    ?>

    Wenn $grund jedesmal erweitert, wenn der filter etwas gefunden hat ($filtered++), und Euch die Infos dann per Mail schicken lässt, habt Ihr wunderbare Infos für das Feintuning des Filters. Auch wenn Ihr etwas neues hinzufügt, könnt Ihr schön erkennen, ob die neue Idee überhaupt "zieht".

    Vorteil der Mailbenachrichtung bei Filterkriterien unter 5 (oder 3 oder was auch immer) :
    Ich kann den Eintrag also, falls er doch kein Spam war, später freischalten.
    Mein Gästebuch stellt also ein Mittelding zwischen einem moderierten Gästebuch und einem unmoderierten mit "hartem" SpamfilterMehr Infos dar.
    Ich moderiere also nur die paar fragwürdigen Einträge. Insgesamt kommt so ein fragwürdiger Eintrag vielleicht einmal im Monat vor (bei ca. 60 ernstgemeinten und 15000 Spams pro Monat).
    Aber wie gesagt, ist diese "halbmoderierte" Lösung in meinen Augen sehr praktikabel. Fast alle Bescuher sehen Ihren Eintrag sofort, haben keinerlei Umstände durch Captchas oder ähnliches, und Spam im Gästebuch ist ebenso zu fast 100% ausgeschlossen.
    Und die Arbeit, die ich jetzt noch mit dem Gästebuch verbringe, ist eigentlich gleich Null.



Urheberrecht

Alle auf der Domain http://www.naturfotografie-digital.de und deren Unterverzeichnissen veröffentlichten Aufnahmen und Texte
unterliegen dem Urheberrecht und dürfen ohne ausdrückliche schriftliche Einwilligung des Autors bzw. Fotografen
nicht anderweitig verwendet oder veröffentlicht werden. Zuwiderhandlungen werden ausnahmslos zur Anzeige gebracht.
Die entsprechenden Bildautoren sind in der Grossbildansicht erwähnt, die Bildautoren sind jeweils auch die
Besitzer der Urheberrechte.

Ausnahmeregelung für Schüler : Schüler dürfen Texte und Bilder für Ihre Hausaufgaben dann verwenden, wenn
die Fotos und Texte nicht anderweitig veröffentlicht werden und die Bilder und Texte nicht ausserhalb der Klasse/des Kurses
anderen zugänglich gemacht werden. Insbesondere ist die Veröffentlichung der Bilder (oder Hausaufgaben mit
Bildern dieser Internetpräsenz) im Internet nicht gestattet.


Besucherzaehler
Statistik

Nutzungsbedingungen Haftungsausschluss / Datenschutz Impressum











CSS ist valide! Valid XHTML 1.0 Strict


For the English Version please click here : Digiscoping