Gästebuch-Script mit SPAM-Schutz

View this page in English.

Version

Aktuelle Version: V4.1 (2016/11/14) - gb_v4.1.zip (181 KB)

Neues

Das Script ist unter PHP 7.0 erfolgreich getestet.

Das Script ist in objektorientierter Weise geschrieben. In der Beispieldatei gb.php kann man sehen, wie es eingebunden wird. Außerdem kann man eine Zeitzone einstellen, die seit PHP5 zwingend erwartet, aber in manchen PHP-Einstellungen nicht vorgenommen wird.

Weitere Änderungen im Change Log.

Features

Installation

Die im ZIP-Archiv enthaltenen Dateien und Verzeichnisse auf den Webspace kopieren.

Die Datei /gb/scripts/gb-data.xml muss von PHP beschrieben werden können. Die erforderlichen Dateirechte sind mit dem FTP-Programm entsprechend zu setzen (z.B. 0666).

Integration

Das Script ist sehr leicht in eine bestehende Seite zu integrieren. Dazu bieten sich zwei Möglichkeiten:

  1. Man nutzt das Script gb.php, welches eine komplette HTML-Datei ausgibt. Es nutzt dazu eine HTML-Datei als Vorlage (gb-template.html), die man selbstverständlich verändern kann.
  2. Bei dynamisch erstellten Seiten möchte man den Inhalt des Gästebuchs sicherlich nur als Bestandteil eines HTML-Dokumentes einbinden. Dazu kann man auf die Datei gb.php verzichten und nur das Script gb.script.inc inkludieren, welches keine komplette HTML-Datei generiert, sondern lediglich ein DIV erzeugt, in welches es einen Textabsatz für das Menü und eine Definitionsliste für die Einträge schreibt.
    Seit Version 4.0 gibt das Script gb.script.inc überhaupt nichts aus, sondern stellt eine Klasse bereit, mit der man ein Objekt erstellen kann, welches die Gästebuch-Ausgabe bereitstellt. Bei der Instanziierung des Objektes kann man das gewünschte Encoding der Gästebuch-Ausgabe einstellen.

Alles ist mit CSS frei gestaltbar. Der ausgegebene HTML-Code sieht dann so aus:

<div id="guestbook">
<p class="menue"><a href="?gb_task=new_entry" class="new-entry">Neuen Eintrag verfassen</a> | Beiträge 1 - 4 (von 4) | « neuere | ältere »</p>
<dl>
    <dt><span>Besucher</span> am 11.11.2006 um 11:11 Uhr:</dt>
    <dd>Mein GB-Eintrag...</dd>
</dl>
</div>

Die CSS-Datei zum Gestalten dieses Outputs ist umfangreich kommentiert, sodass Änderungen relativ leicht fallen sollten - etwas Kenntnisse in CSS vorausgesetzt.

Admin-Bereich

Einige der am häufigsten benötigten Funktionalitäten sind über ein Admin-Tool erreichbar, zu dem man über einen URL-Parameter "gb_admin" gelangt.

Wenn man z.B. auf http://example.org/gb/gb.php?gb_admin geht, dann erscheint ein Login-Formular, in welchem man sich als Administrator anmelden kann.

Der Admin-Bereich ist vor dem ersten Benutzen des GBs zu konfigurieren! Dieses bedeutet vor allem, dass ein neues Passwort und ein neuer Benutzername eingerichtet werden müssen.

Auch ein Wortfilter für unerwünschte Wörter ist dort konfigurierbar, benötigt aber Kenntnisse in der Syntax regulärer Ausdrücke.

Für automatische Benachrichtigungen per Email existiert die Möglichkeit, eine dafür vorgesehene Mailadresse einzurichten. Davon unabhängig kann der Mailversand generell abgeschaltet werden.

Auch der moderierte Betriebsmodus kann dort ein- oder abgeschaltet werden. In diesem Betriebsmodus werden neue Einträge erst versteckt, bis sie durch einen Administrator zur Anzeige freigeschaltet werden.

Spam-Schutz

Durch eine erzwungene erste Vorschau, nach der erst die Eintragung endgültig übernommen werden kann, scheitern bisher alle automatisierten Eintragungen. Daher ist diese Maßnahme die bisher einzige zum Schutz vor SPAM. Sollten die Bots aber klüger werden und auch diesen Mechanismus knacken, ist es immernoch möglich, reguläre Suchmuster über die Eintragungen laufen zu lassen, bevor diese dann tatsächlich in der XML-Datei landen. Durch Sessions wirkt dieser Mechanismus hoffentlich verschärft.

Demo

Dieses Gästebuch-Script benutze ich selbst auf dieser Seite. Daher kann es live in Aktion betrachtet und ausprobiert werden: zu meinem Gästebuch.

Sonstiges

Tipps für die häufigste Fehlermeldung, wenn jemand versucht, mein Script anzupassen

Den Inhalt der ZIP-Datei kann man in ein beliebiges Verzeichnis innerhalb von DocumentRoot ablegen, nicht jedoch in /cgi-bin/ oder einem Unterverzeichnis davon!

Mittlerweile erreicht mich die x-te Mail mit der Bitte um Hilfe, da PHP eine Fehlermeldung ausgibt, die in etwa so aussieht:

Warning: session_start(): Cannot send session cache limiter - headers already sent...

Wie kann man das reparieren? Dazu muss man etwas über den Session-Mechanismus in PHP wissen.

Zum Verständnis

Damit der Server den Besucher wieder erkennt, setzt er (wenn möglich) über den Browser ein Cookie. Ein Cookie zu setzen bedeutet, innerhalb des HTTP-Headers (erste paar Bytes bei der Datenübertragung, noch bevor HTML-Code gesendet wird) die erforderlichen Daten zu senden.

Wenn ein PHP-Script bereits HTML-Daten an den Browser geschickt hat, dann kann es "nachträglich" natürlich keine Cookie-Daten mehr senden. Daher rührt die obige Fehlermeldung.

Ein Beispiel, wie "HTML-Daten" bereits an den Browser gesandt werden können, so dass es auch der unbedarfte Scripteschreiber auf Anhieb erkennt:

------script.php------
<html>
<?php
include "head_script.php";
?>
...
</html>
----------------------

Und nun eine andere Herangehensweise mit weniger offensichtlichem Problem:

------script.php------
 
<?php
include "head_script.php";
include "body_script.php";
include "gb.script.inc"; // GB-Script
include "footer_script.php";
?>
----------------------

Man beachte im zweiten Beispiel, dass die Script-Datei mit einer Leerzeile beginnt. Auch das sind schon "HTML-Daten"! Daher wird bei der Abarbeitung der komplette HTTP-Header ausgegeben, ein Zeilenumbruchszeichen (für die Leerzeile) dazu, bevor das "head_script.php" abgearbeitet wird. Das GB-Script, das eventuell gerne noch an den Header-Daten gefummelt hätte, kann das nun nicht mehr tun.

Die Lösung

Schauen Sie sich bitte sehr genau an, was ich in der Datei "gb.php" wie gemacht habe. Sollte das nicht helfen, schauen Sie sich einmal an, was die Funktion ob_start() bewirkt, und wie damit umzugehen ist. Näheres finden Sie auf http://de2.php.net/manual/de/ref.outcontrol.php.

Mein Script hat Ihnen genützt?

Ich freue mich, wenn mein Script für jemanden nützlich ist. Daher sind E-Mails diesbezüglich immer willkommen. Auch für Verbesserungsvorschläge habe ich ein offenes Ohr, da ich auch ständig dazulerne und meine Scripte gerne besser und sicherer mache.