Naja, es ist ja nicht so, dass die Seiten die ich programmiere "gut" besucht werden, da es kleine Projekte sind. Aber dennoch braucht es einen einfachen Schutz, der das meiste abhält.
Ein einfacher Schutz, der auch tatsächlich einfach ist, reicht meist völlig, denn der beste Botschutz hat nicht die ausgefeilste Technik, sondern ist einfach nur einzigartig.
Je mehr Webseiten ein System nutzen, desto günstiger wird das Knacken der einzelnen Installation. Ein Bot für 1000 € kostet bei einem System, dass auf 10.000 Seiten im Einsatz ist, nur 10 Cent pro Werbung. Bei einem System, das nur auf einer Webseite aktiv ist, kostet die einzelne Werbung 1000 €. Auf welches sich die Spammer stürzen werden, dürfte offensichtlich sein.
Du kannst es dir also wirklich einfach machen und zum Beispiel ein Dutzend dumme Fragen einbauen, etwa: "Wo wachsen Bäume? [ ] Mond, [ ] Sonne, [ ] Erde". Wenn du etwas Lustiges einbaust, hat das ganze sogar Unterhaltungscharakter.
Das Kontaktformular auf meiner Seite ist übrigens gänzlich ungeschützt. Als das Thema beim letzten Mal aufkam, hatte ich vorsichtshalber nochmal geprüft, ob es noch funktioniert (ja, es funktioniert), weil es mich nach den ganzen Horrorgeschichten anderer Leute wunderte, dass das Ding spamfrei bleibt.
Das Einzige, was es vielleicht von anderen unterscheidet, ist, dass es per robots.txt von der Indizierung durch Suchmaschinen ausgeschlossen ist, schlicht, weil ich in der Indizierung keinen Nutzen sah. Ob das nun tatsächlich der Grund sein sollte oder ich bislang lediglich Glück hatte, weiß ich nicht. Aber du kannst es ja mal ausprobieren.
Ich habe keine Lust gross mit DBs zu arbeiten und da war der Zeitstempel eine komfortable und einfache Methode.
Das ist auch in Ordnung, das Problem bei dir ist die Grafik, die sich leichtens mittels Zeichenerkennung automatisiert auslesen lässt.
Das mit dem header() habe ich noch nicht ganz auf die Reihe bekommen.
header("Cache-Control: no-cache");
Dazu muss ich vielleicht sagen, dass die Bildcode-Funktion ein Bild erstellt und auf dem Server ablegt und nicht direkt dem Browser übergibt. Also kann ich keine HeaderInfos zum Bild mitschicken, oder?
Nein, dann nicht, da hast du wieder das gleiche Problem wie mit den <meta>-Angaben: Andere Baustelle.
Es ist aber eh ein Umweg, erst eine Datei zu erstellen. Wenn du imagepng() keinen Dateinamen übergibst, schickt die Funktion die Grafikdaten direkt an den Browser. Mit
header("Cache-Control: no-cache");
header("Content-type: image/png");
…
imagepng($bild);
müsste sich das Cache-Problem daher lösen lassen. Achte jedoch darauf, dass im PHP-Skript als aller Erstes <?php steht und als aller Letztes ?>, keine Leerzeichen, keine Zeilenschaltungen davor bzw. dahinter, gar nichts.
Aber dies nur zur Theorie, in der Praxis hast du ja, wie schon überdeutlich klar geworden sein sollte, ein ganz anderes Problem.