Gästebuch-Script mit SPAM-Schutz

View this page in English.

Version

Aktuelle Version: V4.0 (2013/08/14) - gb_v4.0.zip (205 KB)

Neues

Das Script ist nun in objektorientierter Weise geschrieben. Dadurch hat sich der Mechanismus des Einbindens wesentlich verändert. In der Beispieldatei gb.php kann man sehen, wie es gemacht wird. Außerdem kann man eine Zeitzone einstellen, die von PHP5 zwingend erwartet, aber in manchen PHP-Einstellungen nicht vorgenommen wird.

Weitere Änderungen im Change Log.

Features

Installer

Sollte es mit dem Installer zu Problemen kommen, so kann die im ZIP-Archiv enthaltene Datei "gb.zip" auch manuell entpackt und dann per FTP auf den Webspace hochgeladen werden.

Seit der Version 3.0 kommt das Gästebuch-Script mit einem Installer-Script, mit dem es nach dem Hochladen bequem installiert werden kann. Dazu sind lediglich zwei Dateien auf den Webspace hochzuladen: "gb.zip" und "gb-install.php". Je nachdem, in welchem (Unter-) Verzeichnis das Gästebuch später installiert werden soll, wird dort ein eigenes Unterverzeichnis für sich anlegen.

Sollten Sie bereits eine Installation einer Vorgängerversion haben, dann bietet Ihnen der Installer die Möglichkeit, diese gezippt herunterzuladen, um sie zu archivieren. Anschlißend wird er die vorhandene Installation auf die neue Version upgraden, sodass alle bisherigen Einträge aktualisiert werden. Es geht nichts verloren.

Wer die beiden Dateien z.B. im Stammverzeichnis seiner Domain ablegt, kann dort direkt den Installer aufrufen (z.B. http://example.org/gb-install.php), der dann beim Entpacken von "gb.zip" ein Unterverzeichnis namens "gb" anlegt, in welchem das Gästebuch dann installiert wird. Mit http://example.org/gb/gb.php kann dann das Gästebuch aufgerufen werden.

Nach der Installation entfernt der Installer sowohl die Datei "gb.zip", als auch sich selbst.

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. Seit Version 3.0 befindet sich diese Datei im "Stammverzeichnis" des Gästebuchs. Dadurch ist es einfacher, Verweise im Template auf ihre Richtigkeit zu überprüfen.
  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 ausgibt, in welches es einen Textabsatz für das Menü und eine Definitionsliste für die Einträge schreibt.
    Seit Version 3.0 kann man unmittelbar vor dem Inkludieren von "gb.script.inc" eine Variable "$gb_no_direct_echo" definieren (enthält entweder true oder false), die eine Ausgabe zurückhält. Über die Variablen $GLOBALS['gb-script']['output'] kommt man dann später jederzeit an den auszugebenden HTML-Code.
    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. Bis Version 2.8 war dieses über einen Unterordner "edit" erreichbar, jedoch gelangt man seit Version 3.0 über einen URL-Parameter "gb_admin" dorthin.

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.

Ein Login-Formular zum Ändern der Anmeldeinformationen ist neu im Admin-Bereich.

Weiterhin lassen sich dort diverse Einstellungen zur Anzeigesprache einrichten (momentan werden nur Deutsch und Englisch unterstützt, Spanisch ist noch in Arbeit) und angepasste Hinweistexte verwalten.

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.

Dieser Mechanismus wurde nun durch Sessions verschärft.

Installation

Der Inhalt der ZIP-Datei enthält den Ordner "put_these_online". Die beiden darin enthaltenen Dateien sind in ein beliebiges Verzeichnis innerhalb von DocumentRoot abzulegen, nicht jedoch in /cgi-bin/ oder einem Unterverzeichnis davon!

Damit das Script auf die ZIP-Datei lesend zugreifen kann, könnte es notwendig sein, diese von den Dateirechten her auf den Oktalwert 666 zu stellen (das FTP-Programm kennt sich da aus).

Die Installation wird gestartet, indem das Script "gb-install.php" über den Browser aufgerufen wird. Wurden die beiden Installationsdateien beispielsweise in das Verzeichnis "/main/seiten/" hochgeladen, dann startet man die Installation mit "http://example.org/main/seiten/gb-install.php". Nach der Installation ist das Gästebuch dann unter "http://example.org/main/seiten/gb/gb.php" erreichbar.

Unbedingt nach der Installation den Admin-Bereich über den URL-Parameter "gb_admin" aufrufen und dort neue Anmeldedaten einrichten!!

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

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.