[PHP] Captcha-Überprüfung mag nicht

blu

antiheldIn
ID: 134987
L
14 Mai 2006
90
16
Hi :),

Ich möchte mein Formular zusätzlich mit Captcha vor Spambots absichern. Das ganze sieht dann in der Formularseite folgendermaßen aus:

PHP:
<form action="test.php" method="post">
<input type="text" name="validator" id="validator" size="4" />
<img src="random.php" alt="captcha" width="60" height="20" vspace="1" align="top" />
</form>
<?php 

       if (!empty($_POST['validator']) && $_POST['validator'] == $_SESSION['rand_code']) {
          echo 'klappt :-)';
      	  unset($_SESSION['rand_code']);
		 }
?>

Und in der random.php, in der das Bild generiert wird:
PHP:
<?php
session_start();
if (empty($_SESSION['rand_code'])) {
    $str = "";
    $length = 0;
    for ($i = 0; $i < 4; $i++) {
        $str .= chr(rand(97, 122));
    }
    $_SESSION['rand_code'] = $str;
}

$imgX = 60;
$imgY = 20;
$image = imagecreatetruecolor(60, 20);

$backgr_col = imagecolorallocate($image, 238,239,239);
$border_col = imagecolorallocate($image, 208,208,208);
$text_col = imagecolorallocate($image, 46,60,31);
 
imagefilledrectangle($image, 0, 0, 60, 20, $backgr_col);
imagerectangle($image, 0, 0, 59, 19, $border_col);
 
$font = "captchaschrift.ttf";
$font_size = 10;
$angle = 0;
$box = imagettfbbox($font_size, $angle, $font, $_SESSION['rand_code']);
$x = (int)($imgX - $box[4]) / 2;
$y = (int)($imgY - $box[5]) / 2;
imagettftext($image, $font_size, $angle, $x, $y, $text_col, $font, $_SESSION['rand_code']);

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

Nun treten folgende Probleme auf:
a) Der Buchstabencode, der durch die random.php erstellt wird, bleibt stets der gleiche, wechselt nicht.
b) Trotz vermeindlicher richtiger Eingabe im Formblock komme ich nicht "durch" zum echo '';, dass alles geklappt hat.

Vielleicht springt ja einem sofort was ins Auge :)

Gruß,
blu
 
Zuletzt bearbeitet:
wenn die php-version kleiner 4.2 ist, dann musst du srand() anwenden bevor du rand verwenden kannst.
Zum anderen Problem kann ich nichts sagen (habe mit sessions nie was gemacht).

MfG respawner
 
a) Der Buchstabencode, der durch die random.php erstellt wird, bleibt stets der gleiche, wechselt nicht.
PHP-Version ? Für v<4.2.0 musst du den Zufallszahlengenerator initialisieren, damit er wirklich zufällig wird.
Mehr Infos im
fucking.gif
Manual:
https://de.php.net/rand
b) Trotz vermeindlicher richtiger Eingabe im Formblock komme ich nicht "durch" zum echo '';, dass alles geklappt hat.
Da hilft nur Debugging:
Debugging: Hilfe, da ist ein Fehler!
 
Ich habe PHP-Version 4.4.1..
Es gibt einen Denkfehler an der Sache. Der Zufallsmechanismus wurde nicht ausgelöst. Denn er wird erst ausgelöst, wenn die Kombination einmal richtig eingegeben wurde.

Also habe ich geguckt, woran es liegt.
Vom Formular her lief alles gut, also musste es ja an der falschen Einbindung der Session der random.php liegen.
Und dann sah ich, dass ich sie gar nicht eingebunden habe.. :ugly:

Allerdings stehe ich jetzt vor anderen Problemen.

Wie binde ich eine Datei, die ein Bild generiert so ein, dass sie nicht angezeigt wird?
Wenn ich sie in der Auswertung einbinde, sagt er mir, dass die header-informationen schon gesendet wurden.
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/****/test.php:7) in /www/htdocs/****/random.php on line 33
Wenn ich sie davor einbinde, wird nur noch das Bild und kein Formular mehr angezeigt.

?!

Danke schonmal für eure Ratschläge :)
 
Das habe ich mir ja schon fast gedacht...

Die Frage ist bloß: Wie binde ich die random.php (die bei Aufruf das Bild ausgibt) so in die test.php ein (also an erste Stelle), dass das Bild auf der Seite nicht angezeigt wird ?
Durch ein include('random.php'); oder require_once('random.php'); geschieht obig stehendes..

(Also erst, wenn ich es durch <img src="random.php" /> signalisiere, soll es angezeigt werden..)
 
?!

Ähm, ich schätze wir missverstehen uns..
Es geht nicht darum, dass ich es nicht schaffe, das Bild einzubinden. Es geht darum, dass ich die random.php - also jene Datei, die das Bild mit dem Zahlen/Buchstabencode generiert - in eine andere Seite includen möchte.

Wenn ich dies aber versuche, und es in der ersten Zeile der (in dem Fall test.php) einfüge, durch "include('random.php');" oder "require_once('random.php');", wird der restliche Code der test.php ignoriert und nur das Bild angezeigt (ohne, dass ich da mit einem img-tag darauf zugreifen wollte).
So soll es aber natürlich nicht sein..
 
du hast einen starken denkfehler im script, du kannst nicht die random.php includieren, wenn diese eine grafik-ausgabe sendet.
es muss so funzen:
du generierst nur den code für ein captcha, dann rufst du mit html die php-datei auf die das captcha generiert, diese muss über irgendeinen weg (datenbank oder sonstiges) den code bekommen und darstellen
 
quasi so:
<img src="randome.php?sid=blah" />

Da musst du allerdings aufpassen dass der Browser nicht die captchas cached, sonst wird immer der selbe angezeigt und der Code stimmt nicht.
Deswegen habe ich bei mir einfach noch ein &rnd=6498364986 (zufallszahl) angehängt, damit der Browser das Bild nicht auf der Festplatte finden kann ;)
 
alternativ dem browser einige no-chache header mitsenden und der kommt erst gar net auf die idee, das zu machen^^
 
Was bei mir vom Browser allzuoft irgendwie ignoriert wird.

ich nutze folgendes:
PHP:
header("Expires: Mon, 1 Dec 2003 01:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

bisher hat es noch kein Browser gewagt, dies zu ignorieren :evil: :LOL:
das will ich ihm auch nicht raten^^