# Kontaktformular vor Spam schützen (ohne captcha?)



## Dustin84 (16. Juni 2009)

Hallo,

ich habe ein simples Kontaktformular, welches ich gerne gegen Spam schützen möchte. Mit ist bisher nur die Catpcha Methode bekannt, die ich aber eher ungern nutzen würde. 

Was gibt es sonst für Möglichkeiten?

Gruß
D.


----------



## 00d4vid (16. Juni 2009)

Hmm na ja ich hab das mal so gemacht, dass ich in ein Hidden-Field einen MD5-codierten Timestamp geschrieben habe und beim abschicken dann geprüft habe, ob der Timestamp noch der gleiche is oder ob der vom Bot evtl geändert wurde. Dann hab ich noch einen Timestamp in einem Hidden-Field eingetragen und geprüft, ob das Formular in weniger als 3 Sekunden ausgefüllt wurde (da die Bots ja recht flott sind und Menschen nicht).
Ob das wirklich effektiv ist weiß ich allerdings nicht.


----------



## tombe (16. Juni 2009)

Hi,

außer die schon beschriebene Methode der "Zeitmessung" gibt es glaub ich nicht viel. Wobei das zumindest schon ein bisschen hilft.

Die Frage ist jetzt halt was dir an Captchas generell nicht gefällt. Wenn es die Optik ist, kannst du ja z.B.:

a) ein Listenfeld mit den ganzen Wochentagen einbauen und beim Versenden muss dann der heutige Tag ausgewählt werden

oder

b) du machst ein Textfeld und man muss vor dem Versenden den Tag, den Monat und das Jahr zusammenzählen und die Lösung eintragen

Gruß Thomas


----------



## Sven Mintel (16. Juni 2009)

Moin Dustin,

erläutere doch erstmal, was du unter CAPTCHA verstehst, um nicht von vornherein diverse Möglichkeiten(wie bspw. hier genannt ) auszuschliessen 

Was sich bei mir als recht wirkungsvoll herausgestellt hat:
Ich packe ein Feld namens "subject" ins Formular und verberge es(per CSS) ...das Feld hat keinen Inhalt.
Bots versuchen trotzdem, dies Feld auszufüllen, und wenn es dann mit Inhalt daherkommt, hab ich den Schlingel erwischt.

Meist verwende ich aber eine simple Aufgabe, idR. habe ich einen Submit-Button mit diversen Icons drauf in verschiedenen Farben, der User soll dann zum Senden auf eines mit einer vorgeschrieben Farbe klicken, was ich dann prüfe.
Allerdings ist diese Methode nicht barrierefrei :-(


----------



## Dustin84 (16. Juni 2009)

Ich denke das mit dem versteckten Feld würde schonmal helfen. Wenn ich dann dazu noch den Timestamp von 4 Sekunden ( Wie würde da der Code aussehen?) für die IP nehme, könnte das sicherlich doch schon einiges bringen. 
(Ip bekomme ich so?)

```
$ip=getenv("REMOTE_ADDR");
```


Zudem könnte man doch auch noch prüfen, ob eine URL angegeben wurde (was bei meinem Formular eigentlich nie der Fall ist) und das Formular dann nicht versenden.
(Wenn der Bot  z.B. eine URL beim Feld Namen angibt. Richtig ?

Gruß
D.


----------



## Nord-Süd-Richtung (16. Juni 2009)

Hi

du solltest dir für solche Überprüfungen reguläre Ausdrücke angucken. Desweiten gibt es auch einfachere Captchas wie "Wieviel Beine hat ein Pferd". Ansonsten könntest du folgendes für den Zeitcode verwenden.

```
<input type="hidden" name="stamp" value="<?=time();?>" />
```


```
$bot_speed = time()-4;
if( $_POST['stamp'] <= $bot_speed ) //erwischt
  die('Humans only');
```
Die Ip_Adresse kriegst du mit

```
$ip = $_SERVER['REMOTE_ADDR']
```


----------



## kuddeldaddeldu (16. Juni 2009)

Hi,



Nord-Süd-Richtung hat gesagt.:


> Ansonsten könntest du folgendes für den Zeitcode verwenden.
> 
> ```
> <input type="hidden" name="stamp" value="<?=time();?>" />
> ```



wenn Ihr da etwas mit versteckten Feldern einbauen wollt, dann nehmt _keine_ hidden fields sondern, wie von Sven vorgeschlagen, per CSS versteckte Felder. Es wäre schon ziemlich dämlich, wenn ein Bot ein hidden field ausfüllt. Ein per CSS ausgeblendetes Feld zu erkennen, ist doch viel schwieriger.

LG


----------



## Dustin84 (16. Juni 2009)

ist eingebaut. mal schauen, ob's hilft.


----------



## Nord-Süd-Richtung (16. Juni 2009)

Hi

Wenn der Bot das hiddenfield ausfüllt, könnte man das per

```
if( is_numeric($_POST['stamp']) ){//Überprüft ob $_POST['stamp'] eine Zahl ist
  $bot_speed = time()-4;
  if( $_POST['stamp'] <= $bot_speed ) //erwischt
    die('Humans only')
}
else
  die('Humans can\'t change hidden fields :P');
```
überprüfen.


----------



## Dustin84 (16. Juni 2009)

warum wird überprüft, ob stamp eine Zahl ist ? Das ist doch egal, ob der Bot eine Zahl oder ein Wort eingibt.


----------



## kuddeldaddeldu (16. Juni 2009)

Nord-Süd-Richtung hat gesagt.:


> Wenn der Bot das hiddenfield ausfüllt, könnte man das per
> [...]
> überprüfen.



Der Punkt ist aber, dass solche Bots nunmal "schlau" genug sind, keine hidden fields ausfüllen. Das ist zu einfach. Ein per CSS ausgeblendetes Feld zu erkennen, ist viel komplizierter.

LG


----------



## Dr Dau (16. Juni 2009)

Hallo!


kuddeldaddeldu hat gesagt.:


> Ein per CSS ausgeblendetes Feld zu erkennen, ist viel komplizierter.


Um es noch schwerer zu machen, könnte man für dieses Feld den Klassennamen dynamisch bei jedem Seitenaufruf erstellen lassen.
Und/oder man weist den anderen Feldern auch Klassen zu, welche nicht zwangsweise einen Sinn ergeben müssen. 
Dürfte bei einem schlauen und/oder lernfähigen Bot für noch mehr Verwirrung sorgen.

Ist aber nur so ein Gedankengang von mir. 

Gruss Dr Dau


----------



## Nord-Süd-Richtung (16. Juni 2009)

kuddeldaddeldu hat gesagt.:


> Der Punkt ist aber, dass solche Bots nunmal "schlau" genug sind, keine hidden fields ausfüllen. Das ist zu einfach. Ein per CSS ausgeblendetes Feld zu erkennen, ist viel komplizierter.
> 
> LG



Dann haben wir aneinander vorbeigeredet. Das hiddenFeld enthält den einen timestamp. Beim absenden, wir überprüft, ob das zwischen Aufruf und absende 4sek. vergangen sind. Für den Fall, das ein dämlicher Bot doch das HiddenField ausführt, wird überprüft ob wirklich eine Zahl vorhanden ist.


----------



## kuddeldaddeldu (16. Juni 2009)

Nord-Süd-Richtung hat gesagt.:


> Dann haben wir aneinander vorbeigeredet. Das hiddenFeld enthält den einen timestamp. Beim absenden, wir überprüft, ob das zwischen Aufruf und absende 4sek. vergangen sind. Für den Fall, das ein dämlicher Bot doch das HiddenField ausführt, wird überprüft ob wirklich eine Zahl vorhanden ist.



Dann müsste man aber zumindest noch den alten Wert in einer Session speichern und schauen, ob das im Formular verändert wurde. Der Bot könnte ja erkennen, oder "vermuten", dass das ein Timestamp ist und einfach mal flockig 10 Minuten oder so abziehen.

LG


----------



## Nord-Süd-Richtung (16. Juni 2009)

kuddeldaddeldu hat gesagt.:


> Dann müsste man aber zumindest noch den alten Wert in einer Session speichern und schauen, ob das im Formular verändert wurde. Der Bot könnte ja erkennen, oder "vermuten", dass das ein Timestamp ist und einfach mal flockig 10 Minuten oder so abziehen.
> 
> LG



Es war ja nur ein Beispiel für ihn  
Mich würd so langsam mal interessieren was sein Spamschutz für Fortschritte macht


----------

