[Captcha] Nach übergeben schon neuen Wert?

Tab

unlimited
ID: 374854
L
26 Juni 2007
900
71
Hallo ihr Lieben,

ich habe gerade einen einfachen Captcha erstellt, welcher auch eigentlich geht, dachte ich.

Er ist folgender Maßen aufgebaut.

kontakt.php
PHP:
$value = rand( 100000, 999999);
function/captcha.php
PHP:
<?php

/* Abfangen des Zufallcodes */
$value = $_GET['value'];

/* Variablen des Captchabildes */
$image = imagecreate( 60, 22);
$background = imagecolorallocate( $image, 173, 216, 230);
$font = imagecolorallocate( $image, 131, 139, 139);

/* Erstellen des Captchabildes */
imagestring( $image, 10, 4, 4, $value, $font);
header('Content-Type: image/png');
imagepng( $image);
imagedestroy( $image);
?>
nochmal kontakt.php
Code:
<tr>
    <td>
      <img src="function/captcha.php?value=<?php echo $value; ?>" alt="captcha" /> ²
    </td>
    <td>
      <input type="text" name="code" class="input" style="width: 60px;" maxlength="6" value="<?php echo $code; ?>" />
    </td>
  </tr>

So nun habe ich aber das Problem, dass wenn ich eine IF Überprüfung mache, ob beide gleich sind immer ein Fehler ausgegeben wird. Und zwar das beide nicht gleich sind.

Dann habe ich mir mal beide ausgeben lassen und tatsache da läuft was schief.

Denn wenn ich sie ausgeben lasse, ist der eingegebene Code genau so wie erst da stand, doch als $value code wird mir schonwieder ein neuer angezeigt?

Liebe Grüße,
Markus
 
ähm... höchstwarscheinlich ein cacheproblem, obwohl du ja eine zufälligen wert hinten dran hängst... aber was mir auffällt: der auf dem captcha gezeigte überprüfungscode wird per $_GET an das bild übertragen? was bringt das ganze dann, wenn man den code auch textlich auslesen kann?
 
Zuletzt bearbeitet:
So nun habe ich aber das Problem, dass wenn ich eine IF Überprüfung mache, ob beide gleich sind immer ein Fehler ausgegeben wird. Und zwar das beide nicht gleich sind.

Dann habe ich mir mal beide ausgeben lassen und tatsache da läuft was schief.

Denn wenn ich sie ausgeben lasse, ist der eingegebene Code genau so wie erst da stand, doch als $value code wird mir schonwieder ein neuer angezeigt?

Da musst Du uns schon mal den Code von der Stelle zeigen, wo Du den Vergleich machst, sonst können wir hier nur raten was da schief geht.

Unabhängig davon, solltest Du den Sinn des Captchas nochmal überdenken. Sinn ist, einen Test zu erstellen, den nur ein Mensch lösen kann, sprich den man nicht per Script automatisiert lösen kann.

In dem von Dir angestrebten Konzept ist die automatisierte Lösung allerdings ziemlich einfach. Denn die richtige Lösung, der zu erratene Code, steht direkt im Quelltext der Seite...

Die sähe z.B. so aus:
Code:
<img src="function/captcha.php?value=123456" alt="captcha"/>

Du möchtest, dass der User den Code 123456 errät. Wesentlich leichter hat es das Script, welches die Lösung einfach aus dem Quelltext der Seite entnimmt.


Sprich: Du musst das Captcha so designen, dass die richtige Lösung anders übergeben wird, nicht über den Quelltext der Seite (GET/PUT scheidet also aus).

Eine Möglichkeit wäre beispielsweise die Speicherung in einer Datenbank (das aufrufende Script generiert den Code und legt ihn in der Datenbank ab, das anzeigende Script holt den Code aus der Datenbank und macht daraus das Captcha, das auswertende Script holt den Code aus der Datenbank und vergleicht ihn mit der Usereingabe).


*edit* Ups, zu langsam.
 
PHP:
if ($value != $code)
$fehler = 1;

Das ist der Vergleich. Ihr habt wohl recht, so einn richitgen Sinn hat es wahrscheinlich nicht mehr. Werde es dann wohl mal mit einer Datenbank probieren.

Trotz alle dem würde mich mal interessieren was an dem Captcha von mir falsch ist?

Liebe Grüße,
Markus
 
Und wo kommt $code her? geklärt.

Wo findet die Auswertung statt? Am Anfang, oder Ende der Datei?
 
Zuletzt bearbeitet:
PHP:
$vorname = htmlentities($_POST['vorname'], ENT_QUOTES);
$nachname = htmlentities($_POST['nachname'], ENT_QUOTES);
$email = htmlentities($_POST['email'], ENT_QUOTES);
$nummer = htmlentities($_POST['nummer'], ENT_QUOTES);
$code = htmlentities($_POST['code'], ENT_QUOTES);
$nachricht = htmlentities($_POST['nachricht'], ENT_QUOTES);
 
Was wird denn beim Absenden des Formulars geladen, die kontakt.php?

Wenn ja: dort steht wie Du oben schriebst drin:
Code:
$value = rand( 100000, 999999);

Wenn das kommt bevor $code und $value verglichen werden ist es klar, dass es nicht klappen kann. Wo in dem Formular übergibst Du eigentlich das generierte $value um es mit dem eingegebenen Code zu vergleichen?
 
Es wird beim absenden alles aus der kontakt.php gemacht. In der captcha.php ist dann nur der Bildgenerierungscode drinne!

Liebe Grüße,
Markus
 
Zuletzt bearbeitet:
Na da haben wir doch das Problemchen:

Du erstellst in Zeile 2 einen neuen Zufallscode ($value = rand...) und vergleichst den in Zeile 23 mit dem Code der mit dem Absenden des Formulars eingegeben wurde (also für das vorhergehende Captcha).

Wenn Du es wirklich so machen wolltest müsstest Du schon den aktuell generierten Code mit an das Formular übergeben (z.B. dort ein hidden input mit namen lastvalue und Wert $value machen) und das dann damit vergleichen (also $code == $lastvalue).


Aber wie gesagt, sinnig ist das nicht, denn die richtige Lösung steht ja damit im HTML-Quelltext und ist damit schon "verraten".
 
Ahhh ok es geht :-D

Ich werde die Tage dann wohl mal was mit Datenbank bauen.


So würde es gehen?

-> rand code erstellen
-> in db speichern, hidden feld machen
-> in captcha.php aus der datenbank auslesen
-> einarbeiten
-> fertig

*in die Datenbank immer nur mit UPDATE schreiben!

Liebe Grüße,
Markus
 
Warum Datenbank?
Wenn zwei User gleichzeitig auf dem Kontaktformular sind kommts zu schwierigkeiten!

Erstelle die Zufallszahl in der captcha.php, so wie du's jetzt machst ist die Nummer wunderbar maschinenlesbar!

schreibe sie dort in eine $_SESSION

Vergleiche bei der Auswertung dann einfach $_POST
Code:
 mit der $_SESSION
 
Session geht natürlich auch. Inwiefern man das aus der Session-ID wieder auslesen kann weiß ich aber nicht, ggf. den Code vorher hashen.

Bei Datenbank musst Du natürlich schon immer neue Einträge machen, nur einen immer wieder updaten wird nichts, wenn mehrere User drauf zugreifen.

Ich hätte mir das so in der Art vorgestellt:
- Eine Tabelle: authid | code, wobei authid autoincrement ist.
- Beim Captcha-aufrufenden Script: Neuen Code generieren, in die Tabelle eintragen, authid ermitten (last_insert_id).
- Authid ins Eingabeformular als hidden-Feld und authid an das Captcha-zeichnende Script übergeben (per GET).
- Captcha-zeichnendes Script ermittelt anhand der Authid aus der Tabelle den code und malt ihn.
- Auswertendes Script nimmt authid aus dem Formular, holt dazu den Code aus der DB und vergleicht ihn mit dem eingegebenen.


Okay, mit Sessions gehts einfacher, stimmt wohl.
 
Session-ID und Captcha speichern.
Sicher und einfach.

Captcha bei jedem Aufruf des Formulars erneuern.
Damit ist auch kein Direktaufruf möglich.