# Gästebuch Spam verhindern



## Friesi (31. Januar 2006)

Hallo!

Derzeit wird mein Gästebuch von Spambots heimgesucht.

Ich habe mein Script so verändert, das ein Validationcode erzeugt wird und dieser erst eingeben werden muss.
Trotzdem kommen immer wieder neue Spameinträge.

register_globales sind auf off. Im Script prüfe ich, ob der Imagecode richtig ist, erst dann wird das Script weiter ausgeführt.

Die Eingabe von einem neuen Eintrag sieht so aus:






Der String aus dem Image wird in einer Session gespeichert: $_SESSION['string'] und wird dann im Script auf Gültigkeit geprüft:


```
if ($page == 'write'] {
    session_start();

    $email = strip_tags($_POST['email']);
    $name = strip_tags($_POST['name']);
    $comment = strip_tags($_POST['comment']);
    $homepage = strip_tags($_POST['homepage']);
    $wohnort = strip_tags($_POST['wohnort']);
    $icq = strip_tags($_POST['icq']);
    $msn = strip_tags($_POST['msn']);
    $img_str = $_SESSION['string'];
    $img_frm_str = $_POST['imgcode'];

    $adminname = $settings[adminname];

    $date = frdate();

    if (strtoupper($img_str) == $img_frm_str) {
        if (empty($name) && empty($comment) && empty($email)) {
            $array = array("textcolor" => $settings['textcolor'], "error" => "$lang[9]", "error1" => "$lang[10]", "error2" => "$lang[11]", "back" => "$lang[12]");
            echo $tpl->parse($tpl->get("error_1"), $array);
        } else {
            if (!ereg("^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+.([a-zA-Z]{2,3})$", $email)) {
                $array = array("textcolor" => $settings['textcolor'], "error1" => "$lang[13]");
                echo $tpl->parse($tpl->get("error_2"), $array);
            } else {
                if ($homepage != ''] {
                    if (substr($homepage, 0, 7) != "http://") {
                        $homepage = "http://" . $homepage;
                    }
                }
                if ($settings['spam'] == 'on'] {
                    $ip = $_SERVER[REMOTE_ADDR];
                    $get_log_time = getdate();
                    $log_time = "$get_log_time[minutes]";
                    fr_mysqlconnect($settings['dbhost'], $settings['dbuser'], $settings['dbpass'], $settings['dbname']);
                    $select = mysql_query("SELECT * FROM $settings[iptable]");
                    while ($entry = mysql_fetch_array($select)) {
                        if ((($entry[log_time]) > ($log_time + 2)) or (($entry[log_time]) < ($log_time -2))) {
                            mysql_query("DELETE FROM $settings[iptable] WHERE ip_adress = '$entry[ip_adress]'");
                            $entry[ip_adress] = 'del';
                        }
                        if ($ip == $entry[ip_adress]) {
                            $array = array("textcolor" => $settings['textcolor'], "error" => $lang[14], "back" => "$lang[12]");
                            echo $tpl->parse($tpl->get("error_3"), $array);
                            $ip = 'spam';
                            break;
                        }
                    }
                    if ($ip != 'spam'] {
                        mysql_query("INSERT INTO $settings[iptable] VALUES ('$ip'['$log_time']");
                    }
                }
                if ($ip != 'spam'] {
                    $comment = cleancomment($comment); // clean and format comment

                    fr_mysqlconnect($settings['dbhost'], $settings['dbuser'], $settings['dbpass'], $settings['dbname']);

                    mysql_query ("INSERT INTO $settings[gbooktable] VALUES (''['$name'['$email'['$wohnort'['$homepage'['$date'['$comment'['$icq'['$msn'['']");
                    // send emails
                    include("language/lang_$settings[lang].inc");
                    mail($email, $lang[16], $lang[17], "From: $settings[adminmail]");
                    mail($settings[adminmail], $lang[18], $lang[19], "From: $settings[adminmail]");
                    if (!empty($country)) {
                        include("language/lang_$country.inc");
                    } else {
                        $country = $settings['lang'];
                        include("language/lang_$country.inc");
                    }
                    $array = array("self" => "$PHP_SELF", "country" => "$_GET[country]", "insertdone" => "$lang[20]", "togbook" => "$lang[21]");
                    echo $tpl->parse($tpl->get("add_comment_done"), $array);
                }
            }
        }
    } else {
        $array = array("textcolor" => $settings['textcolor'], "error" => $lang[28]);
        echo $tpl->parse($tpl->get("error_2"), $array);
    }
}
```

Selbst ein IP Spamschutz bringt nichts (Das Gästebuch wird dann eben alle 5 min "besucht"). 
Ich will es aber auch nicht moderieren.

Jetzt frage ich mich nur, wie man an den Schutz der Imagevalidation umgehen kann?
Klar kann man ein Bild durch ein Programm auslesen, doch verwende ich schon extra eine Schriftart die man nicht so super lesen kann.

Oder ist in dem Script irgendetwas unsauber programmiert, was man ausnutzen könnte?

Bin über jede Hilfe / Tipps dankbar


----------



## Katzenbauer (1. Februar 2006)

Solange du keine Probleme mehr mit Spamrobots hast solltest du deinen Schutz auch nicht verstärkern. Das mögen User nicht so gerne 

Du könntest aber noch versuchen etwas anhand des User_Agenten zu machen. Zwar wird sich kaum ein Bot als Bot identifizieren aber man weiß ja nie. Schau einfach mal in deinen Logs nach.


----------



## Friesi (1. Februar 2006)

Eigentlich will ich auch nicht nochmehr Schutz einbauen, nur hat das mit dem Bildcode auch nicht geholfen, was ich schon als sehr sicher eingestuft habe. 
Solangsam glaube ich, der Bot verwendet garnicht die "write" funktion vom Gästebuch.

Doch auf den MysqlServer kommt man nur vom localhost drauf. PHP Version ist 5.1.2, hat die vielleicht einen Bug den man ausnutzen kann?

Eine Prüfung auf den User_Agent wäre noch eine möglichkeit, doch viele unterdrücken diesen ja auch. Wenn der Bot aber schon die Bildcode Funktion übergehen kann, dann wird er auch den User_Agenten faken.


----------



## Katzenbauer (1. Februar 2006)

Sieht so aus also ob es der Bot auf dich abgesehen hat. Eventuell ist es der gleiche mit ner festen Ip. Dann solltest du ihn leicht bannen können.


----------



## Friesi (12. Februar 2006)

Leider hat er nicht die selbe IP!
Auch eine umbenennung der Variablen hat nichts gebracht, glaub ich muss einfach prüfen ob HTML in dem Beitrag ist und diesen dann einfach nicht in der Datenbank speichern.
Leider fällt mir sonst momentan nichts ein. Echt nervig!


----------



## Admi (12. Februar 2006)

Mögliche Lösung: Captchas

siehe:
http://www.deruwe.de/captcha.html


----------



## Friesi (12. Februar 2006)

Captchas hatte ich schon eingebaut, kann aber leider trotzdem anscheint noch irgendwie ausgelesen werden. Warum auch immer :/


----------

