ve_guestbook: Kommentare vor absenden prüfen

  • zab1981 zab1981
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    02. 03. 2006, 18:51

    Hallo,

    seit eingen Wochen habe ich auf meiner Seite einen "Spinner" zu Gast, der
    mehrmals täglich wirre Gästebucheinträge vornimmt. So wie es aussieht,
    werden die Einträge tatsächlich per Hand vorgenommen, den Captcha und
    verschieben der Seite brachte keine Linderung.
    Momentan läuft mein Gästebuch daher auf "moderiert", aber trotzdem beginnt
    es zu nerven, wenn man täglich mehrere eMails bekommt über die neuen
    Gästebucheinträge.

    Die Einträge werden über ständig wechselnde anonyme Proxys eingetragen,
    somit fällt auch sperren der IP weg.

    Meine Idee ist nun, die Gästebuchkommentare bereits beim Absenden auf das
    vorkommen bestimmter Zeichenfolgen zu prüfen und wenn nun beispielsweise der
    (Teil-)String aus der Blacklist auftaucht, der Eintrag gar nicht gespeichert
    wird (und stattdessen eine Fehlermeldung ausgegeben wird).
    So könnte ich beispielsweise die immer gleich lautenden Einträge (meist
    immer die gleichen URLs, oder teile von URLs) im vornherein aussperren.

    Nur hab ich keine Idee, wie ich das umsetzen könnte.

    Mein Gästebuch: ve_guestbook 1.10.0
    Mein Typo: T3 3.8.0

    Bin für jeden Tip und jede Hilfe dankbar ....

    Sebastian


  • woida woida
    Flash Gordon
    0 x
    2356 Beiträge
    1 Hilfreiche Beiträge
    27. 03. 2006, 15:22

    Also ich hab das Gästebuch mal in der Form erweitert, daß bei bestimmten Schlüßelwörtern 'deleted' auf '1' gesetzt wird und der Eintrag somit nicht im Gästebuch erscheint.
    Was sich auch als erstaunlich wirksam rausgestellt hat, ist der Vergleich, ob Vorname gleich Nachname ist. In diesem Fall setzte ich deleted auch auf '1'. Das schöne dabei ist, daß Einträge, die fälschlicherweise als "Spam" erkannt wurden, nicht verloren sind.

    1. if (strcmp($saveData['surname'],$saveData['firstname']) == 0) $saveData['deleted'] = '1';
    2. $temp=strtolower($saveData['entry']);
    3. if (strpos($temp,"jude") > 0 || strpos($temp,"demokratie") > 0 || strpos($temp,"holocaust") > 0) $saveData['deleted'] = '1';

    Der Code kommt VOR

    1. $insert = $GLOBALS['TYPO3_DB']->exec_INSERTquery($this->strEntryTable, $saveData);
    (ca. in Zeile 670)

    Die Suchbegriffe kann man einfach erweitern und müssen klein geschrieben werden. Je nach Seite kann es auch sein, daß die nicht passen (zb. demokratie).

    Im Prinzip wär es besser, einen Regulären Ausdruck zu verwenden, aber leider hat der Linux-Regexp nicht unter Windows funktioniert, so daß ich hier strpos verwende.

    Wenn man die Einträge gar nicht in der Datenbank haben will, so kann man ja vor dem INSERT abfragen, ob 'deleted' auf '1' gesetzt wurde.

    Wenn ich demnächst mal Zeit habe, werde ich noch eine Zeitstempelüberpüfung einbauen, so daß Gästebucheinträge die in weniger als X Sekunden (z.b. 7) geschrieben wurden, zurückgewiesen werden.

    Ein weiterer intressanter Ansatz wäre, den Gästebucheintrag erstmal zu razor zu schicken. Je nach dessen Resultat wird er auch verworfen.

  • johanness johanness
    Jedi-Ratsmitglied
    0 x
    916 Beiträge
    0 Hilfreiche Beiträge
    29. 03. 2006, 18:08

    woida, deine Lösung klappt gut! Danke!

    Allerdings nicht, wenn ich beim Namen auf bestimmte Strings prüfe... Was ist an diesen abgeänderten Zeilen falsch?

    1. $temp=strtolower($saveData['firstname']);
    2. if (strpos($temp,"Rulez") > 0 || strpos($temp,"rulez") > 0) $saveData['deleted'] = '1';
    3.  
    4. $temp=strtolower($saveData['surname']);
    5. if (strpos($temp,"Rulez") > 0 || strpos($temp,"rulez") > 0) $saveData['deleted'] = '1';

    Danke!

  • woida woida
    Flash Gordon
    0 x
    2356 Beiträge
    1 Hilfreiche Beiträge
    29. 03. 2006, 18:13

    #giggle#
    Denk mal scharf nach:
    Ich hab dir mal das "$temp" in den Vergleich eingesetzt:

    if (strpos([b]strtolower[/b]($saveData['firstname']),"[b]R[/b]ulez") > 0

    Siehst dus?

  • johanness johanness
    Jedi-Ratsmitglied
    0 x
    916 Beiträge
    0 Hilfreiche Beiträge
    29. 03. 2006, 22:43

    [quote="woida"]
    #giggle#
    Denk mal scharf nach:
    Ich hab dir mal das "$temp" in den Vergleich eingesetzt:

    if (strpos([b]strtolower[/b]($saveData['firstname']),"[b]R[/b]ulez") > 0

    Siehst dus?
    [/quote]
    Ich kann kein PHP, kannst du mir einfach die "Lösung" geben? Danke.
    Für "email" habe ich es analog gemacht, da klappt es aber auch!?

  • woida woida
    Flash Gordon
    0 x
    2356 Beiträge
    1 Hilfreiche Beiträge
    29. 03. 2006, 22:54

    Man muss nur entweder
    a) den Quellcode lesen und die fett markierten Wörter anschauen. strtolower heißt wohl "string to lower", also einen String in Kleinbuchstaben umwandeln und das beißt sich mit dem großen "R" in "Rulez"
    b) einfach mein Posting komplett lesen

    Die Suchbegriffe kann man einfach erweitern [b]und müssen klein geschrieben werden[/b]

    Für beide Punkte brauchst du keine PHP Kentnisse.

  • zab1981 zab1981
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    29. 03. 2006, 22:54

    1. if (strpos(strtolower($saveData['firstname']),"Rulez") > 0

    Guggst Du:

    [b]strtolower($saveData['firstname'])[/b] Setzt den String $saveData['firstname'] in Kleinbuchstaben um, dann wird mit [b]strpos[/b] auf das Vorkommen des Suchstrings "Rulez" geprüft. Macht hier aber keinen Sinn, da die Variable $saveData['firstname'] für die Abfrage in Kleinbuchstaben gewandelt wurde. Rulez (mit großen "R") kann also nicht gefunden werden ...

    Sebastian

  • zab1981 zab1981
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    29. 03. 2006, 22:57

    An was ich mir jetzt noch die Zähne ausbeisse ist ein schöner Hinweis, dass der Eintrag nicht gespeichert wurde, weil .... ungültige Zeichen im Kommentar.

    Momentan sieht's ja für den Besucher so aus, als ob der Eintrag eingetragen wurde nur nicht angezeigt wird.

    Gibt's da schon eine Überlegung?

    Sebastian

  • woida woida
    Flash Gordon
    0 x
    2356 Beiträge
    1 Hilfreiche Beiträge
    29. 03. 2006, 23:06

    Ich habs mir auch nur kurz angeschaut, aber im Prinzip gibts 2 Möglichkeiten:
    1. Du machst den Vergleich in checkForm() und kannst eine Fehlermeldung übergeben, dann wird der Eintrag aber auch nicht gespeichert
    2. Du fügst nach der Abfrage "if ($insert) {" eine weitere Abfrage ein, ob $deleted auf 1 gesetzt wurde und wenn ja kannst du in
    $markerArray['###FORM_ERROR###'] und $markerArray['###FORM_ERROR_FIELDS###'] eine Fehlermeldung schreiben.

  • johanness johanness
    Jedi-Ratsmitglied
    0 x
    916 Beiträge
    0 Hilfreiche Beiträge
    03. 04. 2006, 17:38

    [quote="woida"]
    Ich habs mir auch nur kurz angeschaut, aber im Prinzip gibts 2 Möglichkeiten:
    1. Du machst den Vergleich in checkForm() und kannst eine Fehlermeldung übergeben, dann wird der Eintrag aber auch nicht gespeichert
    2. Du fügst nach der Abfrage "if ($insert) {" eine weitere Abfrage ein, ob $deleted auf 1 gesetzt wurde und wenn ja kannst du in
    $markerArray['###FORM_ERROR###'] und $markerArray['###FORM_ERROR_FIELDS###'] eine Fehlermeldung schreiben.
    [/quote]
    KLingt recht gut - aber gibt's schon endgültige Lösungsvorschläge für die PHP-Anfänger? ;-)