Capatcha

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • hallo Leute

    ich mir mir einen Capatcha geschrieben allerdings nicht mit Texteingabe sondern eine Bild abfrage. es werden 6 Bilder da gestellt. Unter dem Bild steht dann wo man draufklicken soll. Die Bilder sind in einer db aufgelistet. Ich will das dann ein zufälliges Bild das richtige ist.

    das ist mein Code:

    Quellcode

    1. <?php
    2. session_start();
    3. include('config/database.config.php');
    4. $img = imagecreatetruecolor(384, 256);
    5. imagealphablending($img, false);
    6. imagesavealpha($img, true);
    7. $connection = mysql_connect(dbHost, dbUser, dbPassword) or die ($lang["dbConnectionError"]);
    8. $sql = "SELECT * FROM `" . dbName . "`.`captcha` ORDER BY RAND() LIMIT 6";
    9. $query = mysql_query($sql);
    10. $count = 1;
    11. $correct = rand(1,6);
    12. while ($row = mysql_fetch_object($query)){
    13. if($count == 1){
    14. $start_x = 0;
    15. $start_y = 0;
    16. }
    17. if($count == 2){
    18. $start_x = 128;
    19. $start_y = 0;
    20. }
    21. if($count == 3){
    22. $start_x = 256;
    23. $start_y = 0;
    24. }
    25. if($count == 4){
    26. $start_x = 0;
    27. $start_y = 128;
    28. }
    29. if($count == 5){
    30. $start_x = 128;
    31. $start_y = 128;
    32. }
    33. if($count == 6){
    34. $start_x = 256;
    35. $start_y = 128;
    36. }
    37. if($count == $correct){
    38. $_SESSION['captcha_x'] = $start_x;
    39. $_SESSION['captcha_y'] = $start_y;
    40. $_SESSION['captcha_width'] = 128;
    41. $_SESSION['captcha_height'] = 128;
    42. $_SESSION['captcha_code_en'] = $row->code_en;
    43. $_SESSION['captcha_code_de'] = $row->code_de;
    44. $_SESSION['captcha_count'] = $count;
    45. }
    46. $imgAdd = imagecreatefrompng('images/cpatcha/' . $row->image . '.png');
    47. imagecopy($img, $imgAdd, $start_x, $start_y, 0, 0, 128, 128);
    48. $count += 1;
    49. }
    50. header('Content-Type: image/png');
    51. imagepng($img);
    52. imagedestroy($img);
    53. imagedestroy($imgAdd);
    54. ?>
    Alles anzeigen


    das Script liefert mir auch ein richtiges Bild nur eine Sache stimmt nicht. sagen wir mal $correct ist 3 dann wird nicht der Name in $_SESSION['captcha_code_de'] gespeichert.

    ein Screenshot zum beispiel:
    [Blockierte Grafik: http://87.106.34.205/f.png]

    wie man sieht ist an der Position 6 ist eine Stecknadel und kein Handy.

    wenn ich das ORDER BY RAND() raus nehme werden mir die ersten 6 Symbole angezeigt dafür stimmt der Name mit der Position

    [Blockierte Grafik: http://87.106.34.205/r.png]

    so jetzt meine frage:
    was mache ich falsch???

    mfg JeyBe
  • Moin. Hab jetzt beim Drüberschauen eigentlich keinen groben Fehler gesehen. Das falsche Beispielbild gibt allerdings wenig Aufschluss darüber, was denn nun falsch ist ($_SESSION['correct'] könnte ja auch falsch sein ^^)
    In so Fällen ist es doch am einfachsten, sich den kritischen Block anzuschauen und Testausgaben zu erzeugen, z.B. den Inhalt deiner Session-Variablen und die zu speichernden DB-Daten.
  • Moin,

    wie gesagt, für mich sieht dein Codefragment soweit richtig aus. Deswegen hätte ich vorgeschlagen mit jedem while-Durchlauf eine Testausgabe z.B. mittels echo zu erzeugen, bzw. am Ende einfach mal die Sessionvariablen ausgeben lassen. Da fallen einem am ehesten Unstimmigkeiten auf.
    Einfach damit du nachvollziehen kannst, an welcher Stelle etwas nicht mehr so läuft, wie du es erwartest. Dann kannst du das Problem hoffentlich lokalisieren und im Idealfall beheben ^^

    Wenn du nach deinem Testfall sicher bist, dass deine Session die richtigen Werte gespeichert hat, liegt es am Ende an der HTML-Ausgabe.
  • hi

    ich hab das jetzt mal ausprobiert . so ist jetzt mein Code gewesen ich habe nichts geändert(bis auf die Ausgaben hinzugefügt)

    Quellcode

    1. <?php
    2. session_start();
    3. include('config/database.config.php');
    4. $img = imagecreatetruecolor(384, 256);
    5. imagealphablending($img, false);
    6. imagesavealpha($img, true);
    7. $connection = mysql_connect(dbHost, dbUser, dbPassword) or die ($lang["dbConnectionError"]);
    8. $sql = "SELECT * FROM `" . dbName . "`.`captcha` ORDER BY RAND() LIMIT 6";
    9. $query = mysql_query($sql);
    10. $count = 1;
    11. $correct = rand(1,6);
    12. echo $correct . "<br><br>";
    13. while ($row = mysql_fetch_object($query)){
    14. if($count == 1){
    15. $start_x = 0;
    16. $start_y = 0;
    17. }
    18. if($count == 2){
    19. $start_x = 128;
    20. $start_y = 0;
    21. }
    22. if($count == 3){
    23. $start_x = 256;
    24. $start_y = 0;
    25. }
    26. if($count == 4){
    27. $start_x = 0;
    28. $start_y = 128;
    29. }
    30. if($count == 5){
    31. $start_x = 128;
    32. $start_y = 128;
    33. }
    34. if($count == 6){
    35. $start_x = 256;
    36. $start_y = 128;
    37. }
    38. if($count == $correct){
    39. $_SESSION['captcha_x'] = $start_x;
    40. $_SESSION['captcha_y'] = $start_y;
    41. $_SESSION['captcha_width'] = 128;
    42. $_SESSION['captcha_height'] = 128;
    43. $_SESSION['captcha_code_en'] = $row->code_en;
    44. $_SESSION['captcha_code_de'] = $row->code_de;
    45. $_SESSION['captcha_count'] = $correct;
    46. }
    47. $imgAdd = imagecreatefrompng('images/cpatcha/' . $row->image . '.png');
    48. imagecopy($img, $imgAdd, $start_x, $start_y, 0, 0, 128, 128);
    49. $count += 1;
    50. echo $row->code_de . ' x ' .$start_x . ' y ' .$start_y. '<img src="images/cpatcha/' . $row->image . '.png"><br>';
    51. }
    52. echo '<br><br><br>' .$_SESSION['captcha_x'] . ' y ' .$_SESSION['captcha_y'] . ' '. $_SESSION['captcha_code_de'];
    53. #header('Content-Type: image/png');
    54. #imagepng($img);
    55. #imagedestroy($img);
    56. #imagedestroy($imgAdd);
    57. ?>
    Alles anzeigen


    die Ausgabe sah dann so aus:
    [Blockierte Grafik: http://img819.imageshack.us/img819/3570/aus.th.png]

    es sollte selbsterklärend sein. wenn ich die ausgaben wieder raus nehme kommt der selber Fehler ...

    mfg JeyBe

    edit//

    es muss ja mit er html ausgabe zu tun haben

    Quellcode

    1. echo '<div style="background-color:#FFFFFF;-moz-border-radius:10px;width:384px;padding:10px;margin :auto;"><input type="image" src="captcha.php" alt="Bitte warten..."></div>';
    2. echo "<center>Bitte klicke auf " . $_SESSION['captcha_code_de'] . " (Position: " . $_SESSION['captcha_count'] . ")</center>";

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von JeyBe ()

  • Hey,

    hau mich wenn ich falsch liege, aber das sieht doch soweit richtig aus, oder? $corret war 2, die Taschenlampe liegt in der Session drin. Ich nehme an, diese Testausgabe ist die gleiche, ob nun mit RAND() oder eben ohne, alles andere wäre Wahnsinn ^^
    Den einzigen Wert, den du nicht ausgegeben hast, is captcha_count aus der Session. Aber hey, gehen wir einfach mal davon aus, dass auch diese kleine Zeile stimmt.
    Da der Fehler also offensichtlich nicht in deiner while-Schleife zu finden ist, hängt es wohl an deiner Ausgabe. Kannste vielleicht die Stelle deines Templates posten, in der Grafik und Text vereint werden?
    Wie gesagt, Der captcha_code_de ist in deiner Session ja richtig. Also ist entweder der Wert von captcha_count falsch oder die Darstellung im Template hat nen Fehler.

    Anders kann ichs mir nicht erklären. Umso verwunderlicher, dass es ohne RAND() fehlerfrei funktioniert...

    // edit: aha, du warst schnelelr als ich ^^ Also muss der Fehler in $_SESSION['captcha_count'] liegen, kannst ihn ja spaßeshalber mal in deiner Testausgabe mitausgeben lassen
  • Ich hab nen Verdacht an was es liegen könnte:
    Die captcha.php erzeugt ja ein Bild, welches du in deiner Seite einbindest. Jetzt ist es aber so, dass die php-Seite, die das Bild dann auch einbindet geladen wird, BEVOR der Browser das Captcha-Bild anfordert.

    D.h. zu dem Zeitpunkt, an dem du das ausgibst:

    Quellcode

    1. echo "<center>Bitte klicke auf " . $_SESSION['captcha_code_de'] . " (Position: " . $_SESSION['captcha_count'] . ")</center>";

    Wurde das Bild noch gar nicht erzeugt, und insbesondere wurden da die Session variablen noch nicht gesetzt. Du zeigst quasi zu nem neuen Bild die Daten des vorher erzeugten Captcha Bildes an.
  • Cool, hab das img-src überlesen ^^

    Das Problem ist ja die Reihenfolge, in der du die Grafik erzeugst und sie ausgibst. Du hast doch garantiert eine übergeordnete php, die meinetwegen Sessions allgemein verwaltet oder? Würde sich zumidnest anbieten, wenn du mit Sessions arbeitest.
    Wie auch immer, die Zufallswahl deines richtigen Items könntest du in besagte Datei auslagern. Die endgültige Lösung hängt eh von deiner Dateistruktur ab, wer wo was wie aufruft, tob dich aus.
  • Falls du bei deiner Idee bleiben willst, musst du einfach nur dafür sorgen, das deine Session-Variablen eben vor Aufruf deiner captcha.php beschrieben werden. Mehr nicht.
    Über Sinn und Unsinn können sich dann die Sicherheitsgurus kloppen. Bis jetzt ist mir noch kein Captcha begegnet, das man nicht mit python umgehen könnte, es ist also eh nur eine Frage der Motivation ^^