HTML, CSS, PHP, MySQL

html-php.de

HTML & CSS Stylesheets Referenz JavaScript PHP MySQL Sonstiges Gästebuch Inhalt Impressum

[ Spamschutz ] [ Datensätze löschen ]

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;
  $dz = @mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_PASS) OR die('Verbindung fehlgeschlagen');
  @mysql_select_db(MYSQL_DATABASE) OR die('Konnte Datenbank nicht benutzen');
  $qry = "DELETE FROM Spam WHERE Zeit<$zeit";
  mysql_query($qry) OR die(mysql_error());
  $sql = "INSERT INTO Spam (Code, Zeit) VALUES ($code,$postzeit)";
  mysql_query($sql) OR die(mysql_error());
  ?>

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";
  mysql_query($qry) OR die(mysql_error());

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";
  $erg = mysql_query($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 = mysql_query($qry);
  $anz_ip = mysql_num_rows($erg);
  $anzahl_ip = 0;
  if($anz_ip > 0) {
    for($i=0; $i<$anz_ip; $i++) {
      $postzeit = mysql_result($erg, $i, 'Zeit');
      if($zeit-$postzeit<1800) {
        $anzahl_ip = 1;
      }
    }
  }
  if ($anzahl_ip) {
    echo "<p>Sie k&ouml;nnen innerhalb von 30 min nur ein Eintrag vornehmen.</p>";
  } else {
    // Hier folgt der Code zum abspeichern in die Tabelle
  }
  

back top next