• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zu Captcha

burn4ever

Mitglied
Hallo,
ich möchte gerne eine Captcha-Funktion in mein bestehendes Kontaktformular einbinden.
Habe dazu ein Tutorial gefunden und habe zwei Fragen dazu.

1. Muss hier in dem <img> Tag nicht auf das PNG und nicht wie beschrieben auf die php verwiesen werden?
Einbau ins Formular - Captcha Tutorial - stoppt-den-spam.info

2. Ich habe noch Probleme das ganze in mein script ein zu binden?
Einbau ins Script - Captcha Tutorial - stoppt-den-spam.info
Mein script sie folgendermasen aus:
PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");
echo "<br><br><br><br><br>
<div align=center>Ihr Formular wurde gesendet. Vielen Dank für Ihr Interesse, wir werden Ihre Anfrage umgehend bearbeiten.</div>
<br>
";

$empfaenger="[email protected]";
$betreff = "Ein Kunde hat das Online-Kontaktformular ausgefüllt!";
$nachricht = "Folgende Daten wurden angeben:<br>

interessiert an:    $interesse


Absender:           $absender
Anprechpartner:     $Anprechpartner
Firma:              $Firma
Position/Abteilung: $Pos_Abt
Strasse:            $Strasse
PLZ:                $PLZ
Ort:                $Ort
Land:               $Land
Tel:                $Tel
Fax:                $Fax

";

mail($empfaenger, $betreff, $nachricht, "FROM: Formular");

?>
Wäre das einbinden des Scriptes so richtig?
PHP:
<?php
session_start();
if(isset($_SESSION['captcha_spam']) AND $_POST["sicherheitscode"] == $_SESSION['captcha_spam']){
unset($_SESSION['captcha_spam']);


header("Content-Type: text/html; charset=UTF-8");
echo "<br><br><br><br><br>
<div align=center>Ihr Formular wurde gesendet. Vielen Dank für Ihr Interesse, wir werden Ihre Anfrage umgehend bearbeiten.</div>
<br>
";

$empfaenger="[email protected]";
$betreff = "Ein Kunde hat das Online-Kontaktformular ausgefüllt!";
$nachricht = "Folgende Daten wurden angeben:<br>

interessiert an:    $interesse


Absender:           $absender
Anprechpartner:     $Anprechpartner
Firma:              $Firma
Position/Abteilung: $Pos_Abt
Strasse:            $Strasse
PLZ:                $PLZ
Ort:                $Ort
Land:               $Land
Tel:                $Tel
Fax:                $Fax

";

mail($empfaenger, $betreff, $nachricht, "FROM: Formular");


?>
 
Werbung:
Captchas sind ein absoluter usability Horror.

Es gibt bessere Methoden. Die einfachste ist, einfach mit dem Formular einen Timestamp mitsenden und beim absenden auf dem server prüfen. Ist der abstand zwischen lesen und absenden kleiner als z.b. 3 Sekunden, gehst du einfach von Spam aus. Kein Spammer wartet drei Sekunden um dein Formular zu benutzen.
 
Werbung:
Captchas sind ein absoluter usability Horror.

Es gibt bessere Methoden. Die einfachste ist, einfach mit dem Formular einen Timestamp mitsenden und beim absenden auf dem server prüfen. Ist der abstand zwischen lesen und absenden kleiner als z.b. 3 Sekunden, gehst du einfach von Spam aus. Kein Spammer wartet drei Sekunden um dein Formular zu benutzen.

Hab ich im Icybook eingebaut. Hilft leider nichtmal ansatzweise.

MfG Icy
 
Wie wäre es mit einem zusätzlichen Eingabefeld, das du über CSS versteckst.
Wenn dieses Feld ausgefüllt wird, ist es höchstwahrscheinlich ein Spameintrag. Kannst natürlich auch noch dazu schreiben, dass man das Feld nicht ausfüllen darf/soll.
 
Werbung:
Wie wäre es mit einem zusätzlichen Eingabefeld, das du über CSS versteckst.
Wenn dieses Feld ausgefüllt wird, ist es höchstwahrscheinlich ein Spameintrag. Kannst natürlich auch noch dazu schreiben, dass man das Feld nicht ausfüllen darf/soll.
Das habe ich in der Regel auch drin, die Zeitabfrage ist aber zuverlässiger.
 
Kannst du mal genauer erläutern, wie du das machst? Würde mich nämlich auch sehr interessieren, weil ich Captcha-Bilder extrem verabscheue - und sie mich auch selbst stören.
 
Werbung:
Wie gesagt, du erzeugst den Timestamp mit time() sendest diesen im Formular mit, in einem versteckten Feld. Sinnvoll kann es sein, diesen noch zu verschlüsseln.

Bei einem submit prüfst du auf diesen Wert:
und wenn time() - $timestamp < 5 ist, dürfte mit großer wahrscheinlichkeit ein Bot den Eintrag vorgenommen haben.

Die zweite Prüfung: ein Textfeld, dass du mit CSS versteckst, dann einen definierten Inhalt gibst, wenn sie dieser nach dem Übertragen geändert hat, hat's vermutlich ein Bot gemacht.
 
Und das hilft bei dir? Möchte nicht daran zweifeln, nur eine ungefähre Bilanz, wie viele Spam-Einträge du pro Monat/Jahr hast.
 
Ja, ziemlich. Mittlerweile habe ich so gut wie gar keinen Spam mehr (ich kann aber nicht 100% ausschliessen, dass hin und wieder ein anderer Admin löscht- wobei die Wissen sie sollen Spam stehen lassen).
 
Werbung:
Dann hast du es falsch gemacht.

Du kannst mir glauben, dass ich eine einfache Zeitabfrage per timestamp hinbekomme ;-) SPambots sind längst nicht mehr so durchschaubar und einfach gestrickt, wie sie es mal waren.
Wenn man die mit einer einfachen Zeitabfrage aufhalten könnte, wären die doch kein Problem mehr, oder? Leider sind sie das noch immer.

MfG Icy
 
Du kannst mir glauben, dass ich eine einfache Zeitabfrage per timestamp hinbekomme ;-) SPambots sind längst nicht mehr so durchschaubar und einfach gestrickt, wie sie es mal waren.
Wenn man die mit einer einfachen Zeitabfrage aufhalten könnte, wären die doch kein Problem mehr, oder? Leider sind sie das noch immer.
Wenn man sie nicht mit einer einfachen Zeitabfrage aufhalten kann, wären sie "unbezwingbar". Es geht ja darum, dass ein Bot in dem Fall eine Zeit warten muss. Da Bots Millionen Abfragen absetzen sollen, bedeutet jede kleinste Verzögerung von wenigen Sekunden einen Aufwand der sich nicht lohnt. Die Abfrage muss einfach wirklich eine Pause erzwingen, dann wird der Bot auch scheitern.
 
Als Spambot nehme ich das Textfeld und setze dessen Inhalt um 60 runter. Ist ja nicht schwer einen Unix-Timestamp zu finden, auch als base64 ^^
 
Werbung:
Welches "das Textfeld"? Es ist ein hiddenfeld, von mehreren (z.b. ist da auch eine Session)
und wie soll der Bot ermitteln, dass es a. base64 ist und b. ein Timestamp?
und woher weißt du dass der timestamp in sekunden ist und nicht in Millisekunden?
Oder es reicht ja: zeit1291158366 schon ist es keine Zahl mehr
 
Oder du speicherst die Zeit, ab der das Formular entgegengenommen wird, einfach serverseitig und gibst dem Formular ein Token mit, um das Zuordnen zu können.
 
Oder das.

Da meine Spam Log Datei bisher nicht ausgereift war, habe ich aufgrund dieses threads mal meinen Spamfilter angepaßt.

Zu den Daten. In meiner Anwendung fingen gegen Ende 2006 die Spamzugriffe massiv an. Ich hab ein offenes Forum und ein Gästebuch, beides ohne einen aktiven Schutz.

Anfänglich hab ich Wortfilter eingebaut und deren Erfolgt mitgeloggt. Dabei hatte ich im Schnitt ca. 20-30 MB grosse Dateien erhalten. Darin waren die kompletten Texte geloggt, so das ich meinen Wortfilter immer wieder entsprechend anpassen musste.

Gleichzeitig hatte ich irgendwann ein Spamfeld eingebaut, das mit CSS versteckt wurde und dessen Inhalt nicht verändert werden durfte. Den Test auf das Feld habe ich aber nicht geloggt.

Seit ca. Anfang 2009 setzte ich den hier beschriebenen Zeitfilter ein auch diese Zugriffe habe ich bisher nicht mitgeloggt.

Aber die Größe der Datei, der Einträge die durch den Textfilter gefallen sind, wurde deutlich kleiner (ca. 2-3 MB über einen deutlich größeren Zeitraum).

Nach der Diskussion hier, habe ich meinen Spamfilter mal gründlich aufgeräumt. Den Textfilter habe ich fast komplett rausgeschmissen. Es werden nur noch Links gefiltert (http://|[ url=)
Der CSS Feld-Test (Spamtestfeld) ist drin geblieben.

Mir ist aufgefallen, dass die Spamversuche deutlich zurück gegangen sind. Nur noch 5-10/Tag sind im Filter (0 waren in den 6 Tagen erfolgreich).

Und so sieht die Quote momentan aus:

01.12.2010 00:43 - ... - intervall zu kurz.1
01.12.2010 01:52 - ... - intervall zu kurz.1
01.12.2010 17:48 - ... - Spamfeld ausgefüllt.
01.12.2010 18:01 - ... - intervall zu kurz.1
01.12.2010 18:14 - ... - intervall zu kurz.2
02.12.2010 02:41 - ... - intervall zu kurz.1
02.12.2010 07:53 - ... - intervall zu kurz.1
02.12.2010 10:48 - ... - intervall zu kurz.1
02.12.2010 13:09 - ... - intervall zu kurz.1
02.12.2010 13:22 - ... - intervall zu kurz.1
02.12.2010 21:06 - ... - intervall zu kurz.2
02.12.2010 23:28 - ... - intervall zu kurz.2
03.12.2010 07:40 - ... - intervall zu kurz.1
03.12.2010 08:26 - ... - intervall zu kurz.1
03.12.2010 18:10 - ... - intervall zu kurz.1
03.12.2010 21:34 - ... - intervall zu kurz.4
03.12.2010 22:33 - ... - intervall zu kurz.1
04.12.2010 05:42 - ... - intervall zu kurz.1
04.12.2010 06:36 - ... - intervall zu kurz.1
04.12.2010 09:48 - ... - intervall zu kurz.2
04.12.2010 09:51 - ... - intervall zu kurz.2
04.12.2010 10:34 - ... - intervall zu kurz.2
04.12.2010 12:32 - ... - intervall zu kurz.3
04.12.2010 12:55 - ... - intervall zu kurz.1
04.12.2010 14:50 - ... - intervall zu kurz.2
04.12.2010 16:51 - ... - intervall zu kurz.0
05.12.2010 02:02 - ... - Spamfeld ausgefüllt.
05.12.2010 02:05 - ... - intervall zu kurz.2
05.12.2010 05:10 - ... - intervall zu kurz.1
05.12.2010 07:11 - ... - intervall zu kurz.2
05.12.2010 14:32 - ... - http:
05.12.2010 17:23 - ... - intervall zu kurz.1
05.12.2010 21:15 - ... - intervall zu kurz.1
05.12.2010 22:08 - ... - http:
06.12.2010 00:18 - ... - intervall zu kurz.1
06.12.2010 01:03 - ... - intervall zu kurz.1
06.12.2010 03:41 - ... - intervall zu kurz.1
06.12.2010 04:12 - ... - http:
06.12.2010 11:29 - ... - http:
06.12.2010 11:46 - ... - intervall zu kurz.3
06.12.2010 12:38 - ... - intervall zu kurz.1

Die Zahl hinter intervall zu kurz, sind die Sekunden zwischen ausliefern und abschicken.

Soweit ich das sehe, ist der Zeitfilter ausreichend. Ich muss nur noch testen, ob die längeren intervalle false positives sind.
 
Werbung:
Als Spambot nehme ich das Textfeld und setze dessen Inhalt um 60 runter.
Sie tun es aber definitiv nicht. Ich hab jetzt nach zwei Monaten, in denen ich das Logfile genauer beobachte, keinen einzigen Spameintrag. Die Anzahl der Versuche schwankt ziemlich extrem, zwischen 2 und 30/Tag. Interessant ist, dass die Bots anscheinedn immer Phasen kommen. Eine zeitlang scheitern sie überwiegend an dem unsichtbaren Feld das sie ausfüllen und dann eine zeitlang am zu kurzen Interval.

Also ich brauch keine Captcha Bild. Eine Zeitabfrage und ein Kontrollinput reichen aus, um Spam nahezu zu 100% filtern.
 
Was ein Captcha aber nicht unnötig macht, es ja gibt immernoch Kids etc die in Formularen herumfrickeln.
Ein Captcha wird im img-tag mit der .php Datei eingebunden, dieses PHP-Script erstellt dann die Grafik. Eigentlich ist das garnicht so schwer.

Code:
<img src="captcha.php" width="100" height="40" id="captcha" alt="Captcha">
Wichtigist, dass so ein Captcha dann auch kontrolldaten zur Verfügung stellt. Meines sieht so aus und stellt mir die Variable $_SESSION['captcha'] zur Verfügung:

PHP:
<?php

session_start();

function createCaptcha($width, $height)
{
    mt_srand((double)microtime()*1000000);
    $captcha = mt_rand(1000, 99999);
    $captcha = md5($captcha);
    $captcha = substr($captcha, 0, 5);
    $captcha = strtoupper($captcha);
    $_SESSION['captcha'] = $captcha;
    $image = imagecreate($width, $height) or die("unable to create pic...");
    $bg_color      = imagecolorallocate($image, 255, 255, 255);
    $line_color    = imagecolorallocate($image, 150, 150, 150);
    $elpise_color  = imagecolorallocate($image, 200, 200, 200);
    $elpise_color2 = imagecolorallocate($image, 235, 235, 235);
    $text_color    = imagecolorallocate($image, 0, 0, 0);
    $rand_h1 = mt_rand(1, 40);
    $rand_h2 = mt_rand(1, 40);
    $rand_h3 = mt_rand(1, 40);
    $rand_h4 = mt_rand(1, 40);
    $rand_h5 = mt_rand(1, 40);
    $rand_v1 = mt_rand(1, 100);
    $rand_v2 = mt_rand(1, 100);
    $rand_v3 = mt_rand(1, 100);
    $rand_v4 = mt_rand(1, 100);
    $rand_v5 = mt_rand(1, 100);
    imageline($image, 0, $rand_h1, 100, $rand_h1, $line_color);
    imageline($image, 0, $rand_h2, 100, $rand_h2, $line_color);
    imageline($image, 0, $rand_h3, 100, $rand_h3, $line_color);
    imageline($image, 0, $rand_h4, 100, $rand_h4, $line_color);
    imageline($image, 0, $rand_h5, 100, $rand_h5, $line_color);
    imageline($image, $rand_v1, 0, $rand_v1, 50, $line_color);
    imageline($image, $rand_v2, 0, $rand_v2, 50, $line_color);
    imageline($image, $rand_v3, 0, $rand_v3, 50, $line_color);
    imageline($image, $rand_v4, 0, $rand_v4, 50, $line_color);
    imageline($image, $rand_v5, 0, $rand_v5, 50, $line_color);
    imagefilledellipse($image, mt_rand(0, 100), mt_rand(0, 40), mt_rand(10, 40), mt_rand(10, 25), $elpise_color);
    imagefilledellipse($image, mt_rand(0, 100), mt_rand(0, 40), mt_rand(20, 40), mt_rand(10, 25), $elpise_color);
    imagefilledellipse($image, mt_rand(0, 100), mt_rand(0, 50), mt_rand(20, 50), mt_rand(10, 35), $elpise_color2);

    if (function_exists("Imagettftext"))
    {
        Imagettftext ($image, 22, 0, 10, 30, $text_color, "fonts/font.ttf", $captcha);
    }
    else
    {
        imagestring($image, 5, 25, 12, $captcha, $text_color);
    }

    header("Content-type: image/png");
    imagepng($image);
    imagedestroy($image);
}

createCaptcha(100, 40);
Im abgesendeten Formular prüfe ich dann so:
PHP:
if($_SESSION['captcha'] != strtoupper($_POST['eingabe']))
{
   //tu irgend was
}

else
{
   // sende oder ach was anderes
}

Timestamps und Blacklisten habe ich zusätzlich. Und ich bin nur zu 99% Spam-frei.
 
Zurück
Oben