Spamschutz fürs Gästebuch
Nun sollten wir in unser Gästebuch noch ein Spamschutz einbauen. Dazu benutze ich den
sogenannten Captcha-Code. Dazu wird ein Bild mit Zahlen erzeugt, und dieser Code in dann auf der
Homepage angezeigt. Außerdem wird dieser Code in die Datenbank abgespeichert.
<?php
$img = imagecreatefrompng("captcha.png");
$blue = imagecolorallocate($img,0,0,255);
$green = imagecolorallocate($img,0,255,0);
$gelb = imagecolorallocate($img,255,255,0);
$A = rand(2,9);
$B = rand(2,9);
$C = rand(2,9);
$D = rand(2,9);
$E = rand(2,9);
$F = rand(2,9);
$code = $A.$B.$C.$D.$E.$F;
imagettftext($img, 15, 0, 5, 22, $blue, "./fgfont.ttf", $A);
imagettftext($img, 15, 0, 18, 24, $green, "./fgfont.ttf", $B);
imagettftext($img, 15, 0, 31, 23, $gelb, "./fgfont.ttf", $C);
imagettftext($img, 15, 0, 44, 24, $blue, "./fgfont.ttf", $D);
imagettftext($img, 15, 0, 57, 22, $gelb, "./fgfont.ttf", $E);
imagettftext($img, 15, 0, 70, 23, $green, "./fgfont.ttf", $F);
imagepng($img);
imagedestroy($img);
include "../inc/zugriff.php";
header("Content-type: image/png");
$postzeit=time();
$zeit=time()-1800;
$qry = "DELETE FROM Spam WHERE Zeit<$zeit";
$result = mysqli_query($dblink, $qry);
$sql = "INSERT INTO Spam (Code, Zeit) VALUES ($code,$postzeit)";
$result = mysqli_query($dblink, $sql);
?>
Mit imagecreatefrompng("captcha.png")
laden Sie ein Untergrundbild,
auf der sechs Zahlen, die zuvor mit rand
per Zufall gebildet werden mit
imagettftext($img, Schriftgrösse, 0, X, Y, Farbe, "Schrift", Zahl);
geschrieben werden.
Mit $sql = "INSERT INTO Spam (Code, Zeit) VALUES ($code,$postzeit)";
wird der
Zeitstempel und der aktuelle Code in die Datenbank gespeichert.
Datensätze löschen
Damit die Tabelle nicht zu groß wird, löschen wir alle Datensätze, die älter
sind, als 30 Minuten bzw. 1800 sekunden.
Zum löschen benutzen wir folgenden Code $qry = "DELETE FROM Tabelle WHERE Feld=Bedingung";
.
$zeit=time()-1800;
$qry = "DELETE FROM Spam WHERE Zeit<$zeit";
$result = mysqli_query($dblink, $qry);
Formular erweitern
Natürlich müssen wir den Code noch ins Formular übenehmen. Dazu erweitern wir das
Formular wie folgt:
<form method="post" action="eintragen.php" id="gastbuch">
<div id="eingabe">
<span class="Felder">Name:</span><br>
<input type="text" name="realname"><br>
<span class="Felder">eMail-Adresse:</span><br>
<input type="text" name="email"><br>
<span class="Felder">Homepage:</span><br>
<input type="text" name="url"<br>
<span class="Felder">Nachricht:</span><br>
<textarea name="body" cols="18" rows="8" id="textarea">
</textarea><br>
<span class="Felder">Spamschutz:</span><br>
<img src="captcha/cap.php" alt="Spamschutz">
<input type="text" name="spam" size="5">
<input type="submit" value="Eintragen">
</div>
</form>
Reload-Schutz
Nun fehlt noch ein Reload-Schutz, der verhindert, das ein Beitrag zum wiederholten male gespeichert
wird, wenn die Seite z.B. durch die F5-Taste aktualisiert wird.
Die einfachste weise ist, den Spamschutz-Code aus der Tabelle zu löschen.
$spam=$_POST['spam'];
$qry = "DELETE FROM spam WHERE CODE = $spam";
$result = mysqli_query($dblink, $qry);
Zur Sicherheit wird geprüft, ob von der gleichen IP-Adresse innerhalb der letzten 30 min schon einmal
eine Nachricht gespeichert wurde.
$suchzeit=(time()-1800);
$qry = "SELECT
IP, Zeit
FROM
beitrag
WHERE
IP=$send_ip";
$erg = mysqli_query($dblink, $qry);
$anz_ip = mysqli_num_rows($erg);
$anzahl_ip = 0;
if($anz_ip > 0) {
for($i=0; $i<$anz_ip; $i++) {
$finfo = mysqli_fetch_array($erg, MYSQLI_ASSOC);
$postzeit = $finfo["Zeit"] ;
if($zeit-$postzeit<1800) {
$anzahl_ip = 1;
}
}
}
if ($anzahl_ip) {
echo "<p>Sie können innerhalb von 30 min nur ein Eintrag vornehmen.</p>";
} else {
// Hier folgt der Code zum abspeichern in die Tabelle
}