• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Spamschutz für Gästebuch

Xeno

Mitglied
Liebes Forum

Ich habe vor längerer Zeit für mein private Homepage ein Gästebuch (sehr weitgehend selbst) programmiert, das aber keinen Spamschutz hat und deshalb jetzt leider von Bots vollgespammt wird. Ich möchte es nun mit einem Spamschutz versehen, und zwar am liebsten mit einem mit einer kleinen zufällig generierten Rechenaufgabe (andere Ideen wie grafische Captcha mag ich selber nicht und möchte ich vermeiden). So weit, so gut.

Da ich wenig PHP-Erfahrung habe, frage ich nun, wie ich das angehen soll.

Ausgangslage: Der User klickt auf gaestebuch.php, wenn er das Gästebuch besuchen will. Will er einen Eintrag machen, klickt er auf schreiben1.php, wonach er dort drei Formulare ausfüllen muss (Name, Mailadresse, Text). Der Script nimmt nach dem Betätigen des Buttons "Eintragen" minimale Überprüfungen vor (akzeptiert z. B. keine leeren Einträge, keinen HTML-Code und so was). Wenn die Überprüfung okay ist, dann werden die Einträge in eine MySQL-Datenbank eingetragen, dem Besucher wird der Eintrag bestätigt (mit der Seite senden1.php), und er kann ihn sofort auf gaestebuch.php anschauen. Das funktioniert alles einwandfrei.

Ich habe nun etwas Mühe mir vorzustellen "wo" genau die potentielle spamschutz.php ist (steht nur als Rohfassung, noch nicht scharf geschaltet), und wie genau sie mit den anderen Dateien zusammenspielen soll. Ich stelle mir so vor, dass der User nach den bisherigen minimalen Überprüfungen von schreiben1.php neu (zusätzlich) auf die Spsamschutz-Seite gelenkt wird und dort eine Rechenaufgabe (natürlich zufallsgeneriert) lösen muss. Wenn die Lösung stimmt, geht es weiter wie bisher, sonst gibt es eine Fehlermeldung oder so was aus.

Sind diese Überlegungen mal richtig? Mein Hauptproblem im Moment: Wie schaffe ich es denn, dass die Eingaben des Users gewissermassen über mehr als eine Datei, also von schreiben1.php zu spamschutz.php und dann zu senden1.php "transportiert werden? Ist das überhaupt möglich? Wahrscheinlich schon, aber welche Möglichkeiten gibt es, und welche sind bewährt / empfehlenswert?

Ich will in keine fertigen Scripts, die ich eh nicht begreife, sondern das Problem (ggf. natürlich halt mit Hilfe) selber angehen und schliesslich lösen. Ich weiss aber im Moment nichts, ob mein angedachter Lösungsweg sinnvoll und technisch umsetzbar ist.

Da ich voll erwerbstätig bin, kann ich nicht immer ganz schnell antworten, z. B. auf das Eröffnungsposting wohl erst übermorgen Mittwoch. Ich bitte das im Voraus zu entschuldigen. Im Gegenzug erwarte ich natürlich nicht ein Gratis-Instant-Rundum-Sorglospaket. Meine Kenntnisse sind rudimentär, Lernbereitschaft ist aber vorhanden.

Allen Antwortenden danke ich bereits jetzt!

P.S.: Link zur Seite und PHP-Code gibt's selbstredend, sobald das aufgrund des Diskussionsstandes sinnvoll oder nötig ist, oder immer auf Nachfrage. Erwartet nichts Wahnsinniges!

Lg Xeno
 
Werbung:
Beschäftige dich mit Sessions und zusätzlich füttere google mal mit dem Begriff honeypot
 
Würde dir einen einfache Lösung vorschlagen. Erstell dir Grafiken (alles andere könnte von Bots gelesen werden, dies auch, aber schwerer) wo du deine Rechenaufgaben stellst. Dann diese Aufgabe in deiner normalen Datei, wo du auch den Eintrag speicherst, und auch alles andere abfragst, überprüfen. Eine zusätzliche Datei wäre somt unnötig. Dann kannst du, falls es von dir so gewollt ist, eine Session setzen dass der User "geprüft" ist und bei den nächsten Eintrag oder was auch immer keinen Spamschutz mehr lösen muss.
 
Werbung:
Es reicht vollkommen aus, wenn du ein input-Feld hast was du per CSS die Eigenschaft "display: none" gibst. Wird dieses Feld nun gesetzt, kannst du fest davon ausgehen das es ein Bot ist.
 
Werbung:
Danke für diese Rückmeldungen. Meine Meinung dazu und der Stand der Sache:

1) Sessions scheint mir die beste Lösung für die Umsetzung meiner Idee zu sein. Damit setze ich mich jetzt auseinander. So kann ich das Problem der Übergabe von Werten über mehrere Seiten augenscheinlich dann lösen.

2) Der Google-Hinweis "Honeypot" hat nicht so viel geholfen, die Resultate sind zu disparat. Das liegt auch daran, dass ich mein Eröffnungsposting zu allgemein formuliert habe und mit zu viel Blafasel. Ich edier's jetzt aber nicht mehr.

3) Grafiken in Spamschutz-Seiten mag ich nicht. Ist zugebenermassen ein höchst subjektives Urteil bzw. reine Geschmacksache. Ich verdanke den Tipp aber natürlich trotzdem.

4) Grafische Captchas kommen noch weniger in Frage, die hasse ich geradezu. Ich habe mich jetzt doch wie ursprünglich für eine Rechenaufgabe entschieden, im Wissen darum, dass auch diese Lösung nicht nur Freunde hat.

5) Der Weg mit verstecktem Input-Feld finde ich recht interessant. Ich setze jetzt trotzdem zuerst mal die aufwändigere Variante mit der Rechenaufgabe um, könnte mir aber vorstellen, darauf zurückzukommen.

6) Ich habe das Problem der Weiterleitung (auf die Spamschutz-Seite) gelöst. Als Nächstes baue ich die Spamschutz-Seiten-Datei fertig. Dann muss ich noch das Session-Problem lösen, damit die Werte "erhalten" bleiben.

Ich danke allen bisherigen Antwortern und bitte darum, wenn's recht ist, den Fred mal offenzuhalten.

Lg X.
 
2) Der Google-Hinweis "Honeypot" hat nicht so viel geholfen, die Resultate sind zu disparat. Das liegt auch daran, dass ich mein Eröffnungsposting zu allgemein formuliert habe und mit zu viel Blafasel. Ich edier's jetzt aber nicht mehr.
Und da kommst du nicht auf die Idee, die Suche zu erweitern? Z.B. html formular honeypot :(
 
Werbung:
So, ich habe den Spamschutz erstellt inklusive allem Drum und Dran. Ist sicher (noch) nicht alles perfekt, aber funktionieren tut's erst mal. Wie angekündigt veröffentliche ich jetzt hier den Code. An kritischem Feedback bin ich interessiert. Falls zusätzlich der Code anderer Seiten meiner Website gewünscht wird, bitte einfach sagen. Meine Auftritt ist hier: www.michaelritter.ch

Der Code der Spamschutz-Seite:

Code:
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="de">
<?php
include ("head.php");
?>
<body>
<div id="wrapper">
<?php
include("header.php");
?>
<div id="inhalt">
<div id="inhalt2">
<div id="links">
<?php
$name = $_SESSION['name'];
$name = htmlspecialchars($name);
$mail = $_SESSION['mail'];
$mailkorrekt = filter_var($mail, FILTER_VALIDATE_EMAIL);
$nachricht = $_SESSION['nachricht'];
$nachricht = htmlspecialchars($nachricht);
$zufall1 == $_POST["zufall1"];
$zufall2 == $_POST["zufall2"];
$ergebnis == $_POST["resultat"];
    if($ergebnis == $zufall1 + $zufall2) {
        include ("mysqli_connect.php");
        $id = 0;       
        $timestamp = time();
        $zeit = date("H:i",$timestamp);
        $datum = date("d.m.Y", $timestamp);
        $nachricht = str_replace("\r\n", "<br>", $nachricht);
        $nachricht = mysqli_real_escape_string($link, $nachricht);
        $name = mysqli_real_escape_string($link, $name);
        $eintrag = "INSERT INTO guestbook2 (id, name, mail, nachricht, datum, zeit) VALUES ('$id', '$name', '$mail', '$nachricht', '$datum', '$zeit')";
        $eintragen = mysqli_query($link, $eintrag);
        echo "<p>Sie sind echt, gratuliere! Ihr Beitrag wird veröffentlicht. Sie werden
        jetzt zurück zum Gästebuch geleitet, bitte warten Sie ein paar Sekunden...
        </p><br><meta http-equiv='refresh' content='5;URL=http://www.michaelritter.ch/gaestebuch.php'>";
        }
    else {
        echo "<p>Sie haben die Rechenaufgabe nicht richtig gelöst!</p>";   
        }
?>
</div>
<?php
include("rechts.php");
?>
<div id="footer">
<p>
&copy; Michael Ritter 2012-2013. Alle Rechte vorbehalten. Näheres siehe <a href="http://www.michaelritter.ch/impressum.php">Impressum</a>.
</p>
</div>
</div>
</body>
</html>

Jegliches Feedback verdanke ich bereits jetzt.

Lg X.
 
Das Gästebuch-Formular ist von der User Experience her nicht gut. Du solltest zusätzlich eine clientseitige Formvalidierung einbauen, Entweder per JS oder zumindest das required Attribut von HTML5.

Für Captchas gibt es fertige Plugins wie Securimage. Warum das Rad neu erfinden?
 
Lieber Tronjer

Danke für Deine geschätzte Rückmeldung!

Das Gästebuch-Formular ist von der User Experience her nicht gut.

Ok, könntest Du das noch etwas spezifizieren? Was stört zum Beispiel?

Du solltest zusätzlich eine clientseitige Formvalidierung einbauen, Entweder per JS oder zumindest das required Attribut von HTML5.

Wieso bzw. wozu das? Was würde das (zusätzlich) bringen? Oder anders: Was fehlt denn, was wird zu wenig validiert?

Für Captchas gibt es fertige Plugins wie Securimage. Warum das Rad neu erfinden?

Ich wollte bewusst nichts Grafisches (siehe weiter oben). Natürlich kann man das anders sehen. Auf vorgefertigte Sachen, die nicht mit Grafiken funktionieren und meiner Idee nahe genug kommen, bin ich auf die Schnelle nicht gestossen.

Lg X.
 
Werbung:
Wenn der User eines der drei Felder nicht ausfüllt, wird er auf eine Fehlerseite redirected und muss den "Back" Button seines Browsers klicken. Ansonsten kommt er auf die Captcha Seite und muss dort das Rätsel lösen. Das ist vom Flow her nervig. Nutzerfreundlich wäre, das Captcha direkt im Kontaktformular unterzubringen und dessen Submit zu verhindern, falls Einträge fehlen und die Aufgabe nicht oder falsch gelöst wurde.

Da der User sich nicht einloggen muss, sind Sessions hier auch nicht notwendig.
 
Wenn der User eines der drei Felder nicht ausfüllt, wird er auf eine Fehlerseite redirected und muss den "Back" Button seines Browsers klicken. Ansonsten kommt er auf die Captcha Seite und muss dort das Rätsel lösen. Das ist vom Flow her nervig.

Das ist nicht nur nervig, sondern barer Unsinn bzw. ein klarer Fehler. Das muss ich als Nächstes beheben. Natürlich darf der User nicht zum Spamschutz geleitet werden, wenn seine Eingaben gar nicht vollständig waren und er bereits durch diesen "Test" gefallen ist, das ist klar. Das war auch nie die Idee. Danke für den Hinweis!!

Nutzerfreundlich wäre, das Captcha direkt im Kontaktformular unterzubringen und dessen Submit zu verhindern, falls Einträge fehlen und die Aufgabe nicht oder falsch gelöst wurde.

Zumindest ist dies eine andere Variante. Ob sie per se besser ist, weiss ich (noch) nicht. Aber es ist auf jeden Fall ein interessanter Input.

Da der User sich nicht einloggen muss, sind Sessions hier auch nicht notwendig.

Notwendig wohl nicht, aber nach den von mir gelesenen Beiträgen zum Thema gilt die Lösung mit Sessions als die sauberste. Andere Varianten (z. B. mit unsichtbaren Formularen) gelten als zweifelhafter. Siehst Du das anders?

Lg X.
 
Bau es doch so:

- Über das Formular legst du ein unsichtbares Div mit einer Fehlermeldung.

- In das Formular kommen Name. Email, Nachricht und Captcha. Beim Captcha handelt es sich um zwei Zufallszahlen, die per PHP errechnet und im HTML gerendert werden. Die kannst du entweder in hidden Inputs oder einfacher noch als Data-Attribut ausgeben. Das Data-Attribut von HTML5 solltest du dir unbedingt anschauen. Damit lassen sich beliebige Informationen innerhalb des HTML ablegen.

- Beim Click auf den Submit-Button wird das Formular per JavaScript validiert. In Reihenfolge erst der Name auf Leerstring, Email auf Leerstring und Pattern ([email protected]), Nachricht auf Leerstring und Captcha auf Leerstring und richtiges Ergebnis. Falls die Validierung fehlschlägt, wird der Submit geblockt und das unsichtbare Div mit der Fehlermeldung eingeblendet. Geht die Validierung durch, trägt das Formular Email und Nachricht in die Datenbank ein. Geht dabei etwas schief, wird der User auf eine Fehlerseite weitergeleitet, ansonsten auf das Gästebuch, wo er seinen Eintrag sieht.
 
Werbung:
Hallo,

Andere Varianten (z. B. mit unsichtbaren Formularen) gelten als zweifelhafter.
wie kommst zu der erkenntnis?
Das ist die eineinfachste möglichkeit automatische bots zu blocken.

Die frage ist ja immer wenn möchte man fernhalten?

Das mit dem Rechnen
 
Ok, ein kurzes Update:

1) Das mit der Rechenaufgabe nützt nichts, nicht einmal dann, wenn noch eine dritte Zufallszahl eingeführt wird, die nicht lesbar ist. Die Bots konnten das innerhalb von ein paar Stunden wieder "knacken" (bzw. wohl irgendwie auslesen oder was). Da habe ich mich geirrt. Ich habe auch anderswo gelesen, dass Rechenaufgaben nicht mehr schützen vor Spam.

2) Ich versuchte es dann mit einem Wortfilter (äusserst simpel, ich wollte nur "http" ausschliessen, da ich praktisch nur Linkspam habe). Leider geht es nicht. Ich eröffne darüber aber bald einen eigenen Fred, da es sonst wirr wird.

Hier kann man dann auch mal zumachen.

Lg X.
 
Ok, ein kurzes Update:

1) Das mit der Rechenaufgabe nützt nichts, nicht einmal dann, wenn noch eine dritte Zufallszahl eingeführt wird, die nicht lesbar ist. Die Bots konnten das innerhalb von ein paar Stunden wieder "knacken" (bzw. wohl irgendwie auslesen oder was). Da habe ich mich geirrt. Ich habe auch anderswo gelesen, dass Rechenaufgaben nicht mehr schützen vor Spam.

2) Ich versuchte es dann mit einem Wortfilter (äusserst simpel, ich wollte nur "http" ausschliessen, da ich praktisch nur Linkspam habe). Leider geht es nicht. Ich eröffne darüber aber bald einen eigenen Fred, da es sonst wirr wird.

Hier kann man dann auch mal zumachen.

Lg X.

Ich weiß ja nicht wie lange das bei dir braucht, aber in der ersten Antwort wurde bereits der Begriff honeypot genannt...
 
Werbung:
Ich weiß ja nicht wie lange das bei dir braucht, aber in der ersten Antwort wurde bereits der Begriff honeypot genannt...

Ja, heisst aber was bezüglich Umsetzung? Nahezu jede (ok: nicht ganz jede) Spamabwehr berücksichtigt doch (auch) das Honeypot-Prinzip. Damit kann man doch konzeptionell nichts anfangen. Oder bin ich wirklich so begriffstutzig?!

Lg X.
 
Beim Honeypot hast du ein Eingabefeld, welches per CSS auf unsichtbar gesetzt wird. Da Spambots aber die Angewohnheit haben, alle Formularfelder auszufüllen, kannst du prüfen, ob in diesem Feld etwas steht. Spambots durchforsten den HTML-Code und "sehen" das Formular nie. Und genau deshalb hilft dieser Trick. Zwar nicht immer, aber eine große Anzahl Spams sind damit schon mal erledigt.
 
Zurück
Oben