Spamschutz in Gästebuch einbauen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
ausgabe
ausgeben
beurteilen
bild
chance
code
datum
eintrag
eintragen
email
eventueller angreifer
index
inhalt
meldung
mensch
minute
sicherheit
uhrzeit
vergleich
-
Hallo !
Ich habe mir ein Gästebuch selber programmiert.
index.php
... <?php require_once('antispam.php'); ?> <?php if($_GET['action'] == neu) { $_SESSION['beitrag_gestartet'] = time(); echo " <form action=\"eintragen.php\" method=\"post\" name=\"form\"> <font face=\"Arial\">Ihr Name:</font><br> <input name=\"name\" size=\"40\"><br><br> <font face=\"Arial\">E-Mail:</font><br> <input name=\"email\" size=\"40\"><br><br> <font face=\"Arial\">Inhalt:</font><br> <textarea name=\"text\" cols=\"40\" rows=\"12\" wrap=\"physical\"></textarea><br> <p align='center'><table class='forum' border='0'> <tr> <tr> <td><a href=\"javascript:seticon(':)')\"><img src='images/smilies/1.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':(')\"><img src='images/smilies/2.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':D')\"><img src='images/smilies/3.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':P')\"><img src='images/smilies/4.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':o')\"><img src='images/smilies/5.gif' border='0'></a></td> <td><a href=\"javascript:seticon(';-)')\"><img src='images/smilies/6.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':8')\"><img src='images/smilies/7.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':-(')\"><img src='images/smilies/8.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':-o')\"><img src='images/smilies/9.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':love:')\"><img src='images/smilies/10.gif' border='0'></a></td> </tr> <tr> <td><a href=\"javascript:seticon(':kiss:')\"><img src='images/smilies/11.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':-D')\"><img src='images/smilies/12.gif' border='0'></a></td> <td><a href=\"javascript:seticon(';)')\"><img src='images/smilies/13.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':cool:\")'><img src='images/smilies/14.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':boese:\")'><img src='images/smilies/15.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':eek:')\"><img src='images/smilies/16.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':cry:')\"><img src='images/smilies/17.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':confused:\")'><img src='images/smilies/18.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':bigrin:')\"><img src='images/smilies/19.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':doubt:')\"><img src='images/smilies/20.gif' border='0'></a></td> </tr> <tr> <td><a href=\"javascript:seticon(':evil:')\"><img src='images/smilies/21.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':-|')\"><img src='images/smilies/22.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':rolleyes:\")'><img src='images/smilies/23.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':mad:')\"><img src='images/smilies/24.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':surprised:')\"><img src='images/smilies/25.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':30:')\"><img src='images/smilies/30.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':thumb:')\"><img src='images/smilies/31.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':32:')\"><img src='images/smilies/32.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':33:')\"><img src='images/smilies/33.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':34:')\"><img src='images/smilies/34.gif' border='0'></a></td> </tr> <tr> <td><a href=\"javascript:seticon(':35:')\"><img src='images/smilies/35.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':36:')\"><img src='images/smilies/36.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':37:')\"><img src='images/smilies/37.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':38:')\"><img src='images/smilies/38.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':39:')\"><img src='images/smilies/39.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':40:')\"><img src='images/smilies/40.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':41:')\"><img src='images/smilies/41.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':42:')\"><img src='images/smilies/42.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':43:')\"><img src='images/smilies/43.gif' border='0'></a></td> <td><a href=\"javascript:seticon(':44:')\"><img src='images/smilies/44.gif' border='0'></a></td> </tr> </table></p><br><br> <table> <tr> <td><font face=\"Arial\">Sicherheitscode:</font></td> <td><img src=\"$pic_name\"></td> </tr> <tr> <td> </td> <td><input type=\"text\" name=\"antispam\" size=\"4\" maxlength=\"4\"><input type=\"hidden\" name=\"hashfile\" value=\"<?php echo $txt_name ?>\"></td></tr> </table></p><br> <input type=\"submit\" value=\"Absenden\"> </form> <br> "; } ?> ...
eintragen.php
<?php require('../admin/sql.php'); $name = mysql_real_escape_string($_POST['name']); $email = mysql_real_escape_string($_POST['email']); $inhalt = mysql_real_escape_string($_POST['text']); $datum = time(); $aktiv = 1; //1: Einträge werden aktiviert gespeichert, 2: Einträge werden deaktiviert gespeichert if($_SESSION['letzter_beitrag'] < (time() - 60)) { if($_SESSION['beitrag_gestartet'] < (time() - 10)) { // eintragen //Wurden die benötigten Felder ausgefüllt? if($name == "" OR $inhalt == "") { echo "<font face=\"Arial\">Bitte die Felder \"Name\" und \"Inhalt\" ausfüllen<br><br><a href=\"javascript:history.back()\">Zurück</a></font>"; exit; //Script Ablauf wird unterbrochen, Eintrag wird nicht gespeichert } $eintrag = "INSERT INTO guestbook (datum, name, email, inhalt, aktiv) VALUES ('".htmlentities($datum)."', '".htmlentities($name)."', '".htmlentities($email)."', '".htmlentities($inhalt)."', '".htmlentities($aktiv)."')"; $eintragen = mysql_query($eintrag); //Wurde der Eintrag erfolgreich gespeichert? if($eintragen == true) { echo "<p align=\"center\"><font face=\"Arial\">Beitrag erfolgreich gespeichert.<br><br><a href=\"index.php\">Zurück zum Gästebuch</a></font></p> "; } else { echo "<p align=\"center\"><font face=\"Arial\">Fehler beim Speichern.<br><br><a href=\"javascript:history.back()\">Zurück</a></font></p></p>"; } ?>
Heute Abend habe ich versucht einen Spamschutz einzubauen (siehe index.php unten). Wie kann ich prüfen, ob der Code richtig eingegeben wurde. Wie kann ich eine Meldung ausgeben, wenn der Code nicht richtig eingegeben wurde?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
mach einfach eine abfrage
if($_POST['antispam'] == $_POST['hashfile']) { //was passieren soll wenn der code stimmt } else { //meldung wenn der code falsch ist }
mfg
-
syberpsace schrieb:
mach einfach eine abfrage
if($_POST['antispam'] == $_POST['hashfile']) { //was passieren soll wenn der code stimmt } else { //meldung wenn der code falsch ist }
mfg
Hi !
ich habe es so probiert:
if($_POST['antispam'] == $_POST['hashfile']) { $eintrag = "INSERT INTO guestbook (datum, name, email, inhalt, aktiv) VALUES ('".htmlentities($datum)."', '".htmlentities($name)."', '".htmlentities($email)."', '".htmlentities($inhalt)."', '".htmlentities($aktiv)."')"; $eintragen = mysql_query($eintrag); } else { echo 'Der Sicherheitscode ist falsch! Bitte versuche es erneut!'; }
Aber es kommt trotzdem der Fehler, obwohl der Code richtig ist. -
da du dich schon innerhalb eines php-tags befindest, kannst du die variable $txt_name einfach mit ".$txt_name." in die ausgabe einbauen.
<td><input type=\"text\" name=\"antispam\" size=\"4\" maxlength=\"4\"><input type=\"hidden\" name=\"hashfile\" value=\"".$txt_name ."\"></td></tr>
mfg
ps: darauf wärst du auch von selbst gekommen, wenn du dir den von dir erzeugten quellcode mal im browser angesehen hättest
-
syberpsace schrieb:
da du dich schon innerhalb eines php-tags befindest, kannst du die variable $txt_name einfach mit ".$txt_name." in die ausgabe einbauen.
<td><input type=\"text\" name=\"antispam\" size=\"4\" maxlength=\"4\"><input type=\"hidden\" name=\"hashfile\" value=\"".$txt_name ."\"></td></tr>
mfg
ps: darauf wärst du auch von selbst gekommen, wenn du dir den von dir erzeugten quellcode mal im browser angesehen hättest
Danke ! Jetzt geht alles ! -
Deine Spamschutz ist etwas überflüssig.
Du legst sozusagen den Haustürschlüssel unter die Türmatte..
Den Hashcode sollte man Serverseitig und eindeutig abspeichern.
=>
- PHP
Generiere Hashcode
Schreibe Hashcode mit md5 verschlüsselt mit einer ID und einem Timestamp in DB
Schreibe ID in das "hidden field"
Generiere temporäres bild (praktisch ist als dateiname die ID zu nutzen)
- User
Tippt Hashcode von Bild in Formularfeld
Sendet das Formular ab
- PHP
Lese die ID aus dem "hidden field" aus
Suche in der DB nach der ID und überprüfe dabei den Timestamp (z.B. nicht älter als 15 Minuten)
Wenn gefunden Lösche ID
Lösche Bild mit ID
Lösche alle Einträge mit einem zu hohem Timestamp (also z.B. älter als 15 Minuten) - ggf. mit dem Bilderlöschen in Cronjob auslagern
Verschlüssel den vom User übermittelten Hashcode mit md5 und vergleiche ihn mit dem aus der DB
=> gleich => User ist ein Mensch
=> ungleich => User ist ein Robot oder kann nicht gut lesen
Sooo,
nun hat ein eventueller Angreifer nur die Chance direkt im PHP Script den Hashcode auszulesen, oder von dem Bild.
=> Soweit ich das um die Uhrzeit noch beurteilen kann hast du damit die größtmögliche Sicherheit
Bezgl deinem Problem, warum es nicht klappt: Keine Ahnung! =)
Debug dein Script doch mal.
Lass dir in der index.php den generierten Hashcode ausgeben und vergleich ihn mit dem im "hidden field" und dem der auf dem Bild zu sehen ist. Vllt wird das Bild gecacht!
Auf der eintragen.php lässt du dir ebenfalls den Hashcode ausgeben und vergleichst ihn mit dem gesendeten.
Viel Erfolg
Lucas -
lucas9991 schrieb:
Deine Spamschutz ist etwas überflüssig.
Du legst sozusagen den Haustürschlüssel unter die Türmatte..
Den Hashcode sollte man Serverseitig und eindeutig abspeichern.
=>
- PHP
Generiere Hashcode
Schreibe Hashcode mit md5 verschlüsselt mit einer ID und einem Timestamp in DB
Schreibe ID in das "hidden field"
Generiere temporäres bild (praktisch ist als dateiname die ID zu nutzen)
- User
Tippt Hashcode von Bild in Formularfeld
Sendet das Formular ab
- PHP
Lese die ID aus dem "hidden field" aus
Suche in der DB nach der ID und überprüfe dabei den Timestamp (z.B. nicht älter als 15 Minuten)
Wenn gefunden Lösche ID
Lösche Bild mit ID
Lösche alle Einträge mit einem zu hohem Timestamp (also z.B. älter als 15 Minuten) - ggf. mit dem Bilderlöschen in Cronjob auslagern
Verschlüssel den vom User übermittelten Hashcode mit md5 und vergleiche ihn mit dem aus der DB
=> gleich => User ist ein Mensch
=> ungleich => User ist ein Robot oder kann nicht gut lesen
Sooo,
nun hat ein eventueller Angreifer nur die Chance direkt im PHP Script den Hashcode auszulesen, oder von dem Bild.
=> Soweit ich das um die Uhrzeit noch beurteilen kann hast du damit die größtmögliche Sicherheit
Bezgl deinem Problem, warum es nicht klappt: Keine Ahnung! =)
Debug dein Script doch mal.
Lass dir in der index.php den generierten Hashcode ausgeben und vergleich ihn mit dem im "hidden field" und dem der auf dem Bild zu sehen ist. Vllt wird das Bild gecacht!
Auf der eintragen.php lässt du dir ebenfalls den Hashcode ausgeben und vergleichst ihn mit dem gesendeten.
Viel Erfolg
Lucas
Kannst du mir helfen, sowas zu machen?
Ich versteh das nicht so ganz :) -
Warum so kompliziert mit Datenbank, CronJobs und Bilddateien für jedes einzelne Captcha? Auf der Seite stoppt-den-spam.info gibt es ein ganz gutes Tutorial, wie man Gästebücher über SESSION Captchas schützt.
http://www.stoppt-den-spam.info/webmaster/captcha-tutorial/index.html
Beitrag zuletzt geändert: 21.3.2010 10:00:15 von rnitsche -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage