PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tutorial: Spamfreie Formulare ohne Captcha



Crazy Chrissi
24.10.2007, 22:30
Hi Leute,

ich habe ein Tutorial geschrieben, welches zeigt, wie man Formulare ohne Captcha o.ä. spamfrei kriegt.

Zum Tutorial (http://www.christosoft.de/index.php?page=tutorials%2FAntispam)

Das ganze basiert darauf, dass alle Feldnamen täglich wechseln und verschlüsselt (also nichtssagend) sind. Wenn man dann noch eine Plausibilitätsprüfung (z.B. gültige Mail-Adresse) durchführt, kommt da kein Bot mehr durch. Der Bot kann einfach nicht wissen, wo die gültige Mail-adresse rein muss. Selbst wenn der Bot das HTML für das Formular analysiert wird er nicht dahinter kommen.
Das ganze hat noch ein paar andere Optimierungen.
Mit dem Tutorial gibts auf der Seite auch ein spamfreies PHP-Kontaktformular zum Download.

Auf einer von mir betreuten Seite (Gästebuch & Kontaktformular) mit jeden Tag mehreren Megabyte Spam ist seitdem ich das einsetze noch nie wieder ein Bot durchgekommen. Die Methode lässt sich für alle möglichen Formulare anwenden, also in Gästebüchern, Foren, Blogs, ...

Ich hoffe das hilft jemandem.

Gruß,
Crazy Chrissi

heinerle
25.10.2007, 09:40
Sieht gut aus.

Etwas ähnliches verwende ich auch, allerdings ist dabei zusätzlich der Name des Kontakt-Skriptes auch MD5-kodiert (wird via ModRewrite auf das eigentliche PHP umgelenkt) und enthält zusätzlich die IP-Adresse des Absenders.



# .htaccess

RewriteEngine On
RewriteBase /
RewriteRule ^contact\/([0-9a-f]{32}).php$ /contact/XYformXY.php [L]




# Kontaktformular

print "<form action=\"".md5($_SERVER['REMOTE_ADDR'].$geheim_str).".php\" method=\"POST\">";


Das Skript überprüft dann anhand seines Namens, ob die IP des Aufrufers auch stimmt, um ein Auslesen der Felder und Fluten des eigentlichen Skriptes via Bots zu verhindern.



# XYformXY.php

if(basename($_SERVER['REQUEST_URI'], ".php") != md5($_SERVER['REMOTE_ADDR'].$geheim_str)) ErrorAndExit("invalID: [ID filtered]
if($_SERVER['REQUEST_METHOD'] != 'POST') ErrorAndExit("invalID: [ID filtered]
if($_POST['IP'] != $_SERVER['REMOTE_ADDR']) ErrorAndExit("invalID: [ID filtered]

Itzi
25.10.2007, 15:50
Ja, der Ansatz mit wechselnden, nichtssagenden Feldnamen ist sehr gut. Auch das ändern oder einfügen der form-action URL per Javascript finde ich nicht schlecht (hab ich mal wo gesehen).

Das funktioniert solange die Bots die Beschriftungen nicht zuordnen können.
Ich könnte mir vorstellen, dass sie das sehr bald lernen - zumindest wenn alles einfach angeordnet ist; z.B. per Tabelle. Man könnte das in weiterer Folge durch Positionierung mit Stylesheets o.ä. erschweren. Bildtexte mit unterschiedlichen Dateinamen wären auch eine sichere Möglichkeit.
Ich würde eventuell noch eine höhere Wechselrate anpeilen. Es könnte sein, dass ein Ersteintrag manuell gemacht wird und bis Mitternacht kommen dann 1000 andere...

Früher oder später werde ich auch was in diese Richtung unternehmen, da ich mein Captcha möglichst wieder verbannen möchte.

exe
25.10.2007, 18:36
Das funktioniert solange die Bots die Beschriftungen nicht zuordnen können. Ich könnte mir vorstellen, dass sie das sehr bald lernen - zumindest wenn alles einfach angeordnet ist; z.B. per Tabelle.
Ich glaube nicht, dass sich Spammy die Mühe macht das seinen Bots beizubringen. Da glaube ich eher, dass er einfach seinen Durchsatz erhöht, in der Hoffnung, dass schon mal ein paar Einträge durchkommen. Im Moment dürfte das ja bei den Größen der Botnetze auch kein Thema sein. :sick:

rsWhite
25.10.2007, 18:58
Auf jedenfall eine interessante Idee, hab sie auch gleich mal in meinem blog aufgeführt.

Crazy Chrissi
31.10.2007, 15:16
Vielen Dank für das Feedback!


Auch das ändern oder einfügen der form-action URL per Javascript finde ich nicht schlecht (hab ich mal wo gesehen).

Mit JavaScript hat den Nachteil, dass der Browser das auch können muss. Und MD5 ist dort nur durch Bibliotheken verfügbar, und die haben meist einige KB Dateigröße. Ich wollte das Formular spamfrei bekommen ohne die geringsten Einschränkungen zu erzeugen.

Das funktioniert solange die Bots die Beschriftungen nicht zuordnen können.
Ich könnte mir vorstellen, dass sie das sehr bald lernen - zumindest wenn alles einfach angeordnet ist; z.B. per Tabelle. Man könnte das in weiterer Folge durch Positionierung mit Stylesheets o.ä. erschweren. Bildtexte mit unterschiedlichen Dateinamen wären auch eine sichere Möglichkeit.

An ähnliches habe ich auch schon gedacht. Die CSS-Positionierung wird auch im Tutorial als Möglichkeit genannt. Ich habe zunächst einfach die Beschriftung in ASCII "verschlüsselt", das stellt natürlich nur eine kleine Hürde dar, aber immerhin.
Ehrlich gesagt denke ich nicht, dass Bots so weit verbessert werden, solange es noch so viele Formulare gibt die ohne jegliche Probleme gespammt werden können.


Ich würde eventuell noch eine höhere Wechselrate anpeilen. Es könnte sein, dass ein Ersteintrag manuell gemacht wird und bis Mitternacht kommen dann 1000 andere...

Manuell? Glaube kaum, dass sich Spammer die Arbeit machen, da stimme ich exe zu. Höchstens bei sehr attraktiven Seiten. Aber das ist ja kein Problem. Man kann problemlos jede Stunde die Bezeichner wechseln. Oder alle halbe.

Noch eine Idee: Wenn die Reihenfolge der Formular-Felder egal ist, kann das Script sie jedesmal zufällig anordnen. Dadurch werden Bots noch weiter in die Irre geführt.


Früher oder später werde ich auch was in diese Richtung unternehmen, da ich mein Captcha möglichst wieder verbannen möchte.
Also ich habe wirklich nur gute Erfahrungen damit gemacht.
Ich setze das mittlerweile auf einer Reihe von Seiten ein und bis jetzt ist keinlerlei Bot-Spam durchgekommen. Gegen manuellen Spam kann man ohnehin nichts tun, da hilft auch kein Captcha.

Die Ideen von heinerle finde ich sehr interessant. Das Wechseln des Script-Namens ist natürlich klasse. Man braucht natürlich mod-rewrite, was leider auf viel zu wenigen Servern vorhanden ist. Eine weitere Idee: Man könnte die .htaccess-Datei vom PHP-Script täglich ändern lassen, sodass falsche Adressen zum 404 führen. Oder: Das Script benennt sich selbst um. Dann bräuchte man kein mod-rewrite. Um das "Mitternachts-Problem" zu umgehen bräuchte man das Script dann aber doppelt, d.h. der erste Aufruf nach Mitternacht erzeugt (falls er vor 1 Uhr ist) nur eine Kopie. Die Kopie läuft nur falls es noch vor 1 Uhr ist und löscht sich danach selbstständig. Ach ja, um Mitternacht müssten evtl. noch vorhandene alte Kopien gelöscht werden...
Leichter ließe sich das mit einem Cronjob lösen, aber es ginge auch in reinem PHP. Mal sehen, vielleicht setze ich das bei Gelegenheit mal um.


hab sie auch gleich mal in meinem blog aufgeführt.
Vielen Dank dafür!

Gruß,
Crazy Chrissi

Lukefwkr
24.11.2007, 12:33
Hallo,

Ich bin ja schon länge Zeit auf der Suche nach einem vernünftigen Script gegen Spam-Bots - aber diese Variante finde ich absolut genial !!

Vielen Dank für das Zur-Verfügung-Stellen der Infos.

Grüße

Luke