Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Captcha - Vergleich klappt nicht

Habe auf meiner Seite www.eikehoerding.de unter .gbook ein Gästebuch laufen, wenn ihr es ausprobiert funktioniert es auch.  Nun hab ich versucht, auch unter www.porta-racing.de einen Captcha-Check einzubauen, dazu habe ich einfach mal die entsprechenden Zeilen meines eigenen Gb's kopiert und in das andere GB eingefügt.  Das Problem besteht darin, dass PHP mir manchmal Falscher Zahlencode ausspuckt, manchmal funktioniert es aber...

Mein Gästebuch:

Zahlencode:<br>
         <?php $rd rand(0,3);
             
$pics glob("./gb/*.jpg");
             
$werte=array("3e42R","8hlnQ","a7pYD","W6j8v");
             
?>

             <img src="<?php echo $pics[$rd]; ?>" alt="Code"><br>
             <input type="text" name="codefeld" size="25"><br<br>
     Eintrag:<br>
     <textarea name="gbeintrag" rows="20" cols="40"></textarea><br>
     <br>
     <input type="submit" value="Eintragen" name="absenden"> <input  type="reset" value="Reset">
     </form><br>

             <?php
                 
if(isset($absenden)){
                 if(
$codefeld == $werte[$rd]){
    
         $dateiinhalt file_get_contents(&#39;gbeintraege.txt&#39;);
                 
$datei=fopen ("gbeintraege.txt","w+");
                 
$eintrag stripslashes($eintrag);
       
         $daten="<hr><b>Name:</b> $name<br>
                 <b>Email:</b> <a href=&#39;mailto:
$email&#39;>$email</a><br>
                 <b>Website:</b> <a href=&#39;
$url&#39;>$url</a><br>
                 <b>Eintrag:</b> 
$gbeintrag<br>\n\n".$dateiinhalt;
        fwrite ($datei,$daten);
        fclose ($datei);}
                else {echo
"<b>Falscher Zahlencode!</b><br><br>";}
                }
                if(
file_exists("gbeintraege.txt")){
    
        readfile("gbeintraege.txt");
                }
                else {
    
       echo ("Momentan sind keine Einträge im Gästebuch vorhanden.");
                }
           
?>


Neues Gästebuch:

<?php $rd rand(0,3);
             
$pics glob("./gb/*.jpg");
             
$werte=array("3e42R","8hlnQ","a7pYD","W6j8v");
             
?>

             <img src="<?php echo $pics[$rd]; ?>" alt="Code">
             <input type="text" name="codefeld" >
             <?php
              
if(isset($gbsubmit)){
              if(
$codefeld == $werte[$rd]){
              
$content file_get_contents (&#39;./txt/gbuch.txt&#39;);
              
$data "<div id=&#39;gb&#39;><b>Name:</b> $name<br><b>Email:</b>
             <a  href=&#39;mailto:
$mail&#39;>$mail</a><br><b>Homepage:</b> 
             <a  href=&#39;
$hp&#39;>$hp</a><br><b>Eintrag:</b>   
             
$eintrag<br><br><hr></div>$content";
             
$data stripslashes ($data);
              
$file fopen ("./txt/gbuch.txt","w+");
              
fwrite ($file,$data);
              
fclose ($file);}
              else {echo 
"Zahlencode falsch eingegeben!";}
              }
              if(isset(
$gbbearbeiten)){
                 
$file fopen ("./txt/gbuch.txt","w+");
                 
$gbtext stripslashes($gbtext);
                 
fwrite ($file,$gbtext);
                 
fclose ($file);
                 };
              
readfile (&#39;./txt/gbuch.txt&#39;);
          
?>



           

Kurze Erklärung: Die letze if-Abfrage dient zum löschen der Einträge über einen Admincenter. Ihr könnt die Beiden Bücher gern ausprobieren, vllt. findet ihr ja einen Fehler, aber mir tun schon die Augen weh!

Liebe Grüße und an dieser Stelle schonmal vielen Dank an Jossif, der bestimmt wieder eine Antwort parat hat...

Dark_Dog

Antworten zu Captcha - Vergleich klappt nicht:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Das Problem besteht darin, dass PHP mir manchmal Falscher Zahlencode ausspuckt, manchmal funktioniert es aber...

OK, diesen Satz verstehe ich jetzt mal gar nicht, aber so ungefähr kann ich mir vorstellen, wohin die Reise geht...

Du gehst davon aus, dass glob() dir ein sortiertes Ergebnis zurückliefert. Das scheint nicht durchweg der Fall zu sein und könnte sich gerade auf anderen Servern erst bemerkbar machen. Ich würde an deiner Stelle eine EINDEUTIGE Verknüpfung herstellen zwischen dem Dateinamen des Captcha-Bildes und dem Code, der da drin steht.

greez 8)
JoSsiF

Hallo,
das Problem besteht darin, dass mir manchmal trotz richtiger Eingabe "Falscher Zahlencode" ausgegeben wird, manchmal funzt es aber wieder. Beide Ordner mit den Bildern liegen auf dem selben Server.

EDIT: Könnte es was bringen, wenn ich beide "Scripte" auf ein und den selben Ordner zugreifen lasse, anstatt auf 2 eigene?

LG 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Hallo,
das Problem besteht darin, dass mir manchmal trotz richtiger Eingabe "Falscher Zahlencode" ausgegeben wird

Ja, weil die Zuordnung von Bild und Code nicht eindeutig ist. Siehe letzter Post. 

Gut, Aber warum klappt es dann immer beim anderen Gästebuch?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Gut, Aber warum klappt es dann immer beim anderen Gästebuch?

Weiß ich nicht. Keine Ahnung, wie der Webserver sortiert. Und um sich um sowas keine Gedanken machen zu müssen, einfach mal so programmieren, dass man solche Fälle ausschließen kann. Das ist in dem Fall ja besonders einfach, da du im Prinzip nicht einmal auf eine korrekte Sortierung angewiesen bist.

Ok, ich schau mal, vllt. kann man da noch irgendwas mit führenden Nullen machen.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Ok, ich schau mal, vllt. kann man da noch irgendwas mit führenden Nullen machen.

...du hast es nicht verstanden.

Wenn der Server jetzt nicht richtig sortiert, macht der das mit führenden Nullen auch nicht. Und es sollte auch gar nicht das Ziel sein, die Sortierung richtig hinzubekommen. Lies einfach nochmal die erste Antwort.
« Letzte Änderung: 28.10.07, 11:47:43 von JoSsiF »

Na dann versuche ich es mal so:

Ich speichere die Captcha-"Lösungen" nicht in einem Array, sondern trenne die Endung ".jpg" vom Rest des Dateinamens, welches von glob ausgelesen und von $rd ausgelost wurde und stelle damit den Vergleich an. Somit ist der hinterlegte Wert immer gleich dem Bild;

so richtig?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Keine Ahnung. Du hast noch nie erwähnt, wie deine Dateien heißen.

Mach dir doch einfach ein assoziatives Array mit dem Dateinamen als Key und dem Code als Wert. Damit hast du die Zuordnung. Dann globst du dein Verzeichnis, wählst eine Datei per random aus und sprichst damit das Array an, um den Code zu bekommen...  ():-)

Habs jetzt mal so gemacht, bevor du gepostet hattest:

 

<?php $rd rand(0,7);
             
$pics glob("./gb/*.jpg");
             
$wert=substr($pics[$rd], 5, -4);
             
?>

         <img src="<?php echo $pics[$rd]; ?>" alt="Code">
.
.
.
.
.
.
.
<?php
              
if(isset($gbsubmit)){
              if(
$codefeld == $wert){...}
              else{...};

.
.
.

?>

Nehmen wir an, ein Bild hat den Inhalt "rh3et", so heißt das Bild rh3et.jpg

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Nehmen wir an, ein Bild hat den Inhalt "rh3et", so heißt das Bild rh3et.jpg

Sehr clever. Jetzt brauchen die Bots gar nicht mehr das Bild entschlüsseln, sondern nur noch im Quellcode nachschauen, wie das Bild heißt ;D

Schön - aber funktionieren müsste es dennoch oder?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Jedenfalls hast du eine Zuordnung ... ;)

Gut, das wollte ich hören, denn nun glaube ich, dass mein Server es verlernt hat, zu rechnen. Es erschien mir ja bei meiner allerersten Variante schon sehr merkwürdig, dass es in einem Gästebuch funktioniert, im anderen jedoch nicht. Und genau vor diesem Problem stehe ich jetzt wieder. Probies am besten selbst hier aus. 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Du hast ja richtigerweise nur einen Teil des Codes gepostet, deswegen frag ich zur Sicherheit nochmal ran: Die Daten aus dem Formular holst du aber schon per $_POST[] bzw. $_REQUEST[] oder?

Ja, Guckst du hier, nochmal etwas mehr code:

<form action="gbuch.php" method="post">
           <table cellpadding="5" cellspacing="5" border="0">
            <tr><td>Name: </td><td><input type="text" name="name"></td></tr>
            <tr><td>Email: </td><td><input type="text" name="mail"></td></tr>
            <tr><td>Zahlencode:</td><td><?php $rd rand(0,7);
             
$pics glob("./gb/*.jpg");
             
$wert=substr($pics[$rd], 5, -4);
             
?>

         <img src="<?php echo $pics[$rd]; ?>" alt="Code"></td></tr><tr><td></td>
         <td><input type="text" name="codefeld" ></td></tr>
            <tr><td>Homepage: </td><td><input value="http://www." type="text" name="hp"></td></tr>
            <tr><td>Eintrag: </td><td><textarea name="eintrag" rows="10" cols="35"></textarea></td></tr>
            <tr><td></td><td><input type="submit" name="gbsubmit" value="Eintragen"><input value="Reset" type="reset" name="reset"></td></tr>
           </table>
          </form>
           <br>
          <?php
              
if(isset($gbsubmit)){
              
$codeeingabe $_REQUEST[&#39;codefeld&#39;];
              
if($codeeingabe == $wert){
              
$content file_get_contents (&#39;./txt/gbuch.txt&#39;);
              
$data "<div id=&#39;gb&#39;><b>Name:</b> $name<br><b>Email:</b> <a href=&#39;mailto:$mail&#39;>$mail</a><br><b>Homepage:</b> <a href=&#39;$hp&#39;>$hp</a><br><b>Eintrag:</b> $eintrag<br><br><hr></div>$content";
              
$data stripslashes ($data);
              
$file fopen ("./txt/gbuch.txt","w+");
              
fwrite ($file,$data);
              
fclose ($file);}
              else {echo 
"Zahlencode falsch eingegeben!";}
              }
              if(isset(
$gbbearbeiten)){
                 
$file fopen ("./txt/gbuch.txt","w+");
                 
$gbtext stripslashes($gbtext);
                 
fwrite ($file,$gbtext);
                 
fclose ($file);
                 };
              
readfile (&#39;./txt/gbuch.txt&#39;);
          
?>

PS: Warum gibt es eig beim Beitrag verfassen keinen Code-Button?

 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Jetzt fällt's mir auf...

Du bist'n ganz schöner Witzbold. Du lässt den armen Nutzer einen Code eingeben und vergleichst diesen mit einer Zeichenkette, die du NACH dem Submit nochmal neu per random generierst. Deswegen klappt's auch nur manchmal, aber dann doch eher selten.

Na denn...

greez 8)
JoSsiF

Da kann ich dir grad nich wirklich folgen, deshalb liste ich es mal hier in Textform auf:

1)Es wird eine Zahl zwischen 0 und 7 generiert ($rd)
2)Verzeichnis wird durchsucht und im Array abgespeichert (8 Elemente)
3)Es wird ein Wert zum Vergleich mit der EIngabe hergestellt, und zwar wird der Bildname, das sich hinter der ausgelosten Zahl ($rd) im array $pics verbirgt, geteilt, sodass eine Zeichenkette übrigbleibt ($wert)
4)Es wird ein Bild angezeigt, und zwar genau das Bild, welches sich hinter derselben Zahl im array verbirgt wie oben beim erstellen des Wertes. Somit ist doch - wie ich meine - das Bild was angezeigt wird gleich dem Wert, der     erzeugt wurde.
5)Der String wird geholt und in $codeeingabe gespeichert
6)Nun wird der Eingabestring mit dem´oben hinterlegten Wert verglichen.

Ich meine doch, so ist es richtig, und wenn du meinst nein, berichtige den Text doch bitte, ich versteh sonst nich, was du meinst.

 

Zitat
die du NACH dem Submit nochmal neu per random generierst.

Nach dem Submit sehe ich nichts, wo was generiert wird...

Ich weise aber nochmals darauf hin, dass es mich gewundert hat, dass  es bei Version Nr. 1 auch nich wie erwartet funktioniert hat.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Ich meine doch, so ist es richtig, und wenn du meinst nein, berichtige den Text doch bitte

Nö, da könnte ja jeder kommen ;D

Ich versuch's nochmal:

Das Skript ruft sich beim Absenden selber neu auf. Es gibt da einen If-Block, der nur NACH dem Absenden aufgerufen wird, denn so hast DU das programmiert. Richtig soweit, denn es soll ja nichts verarbeitet werden, wo nichts zu verarbeiten ist.

Bringen wir mal den zufällig generierten Wert ins Spiel. Der wird dummerweise in einem Teil des Skripts gebildet, der IMMER aufgerufen wird. Was passiert?

(1) Das Formular lädt, ein Captcha wird zufällig ausgewählt und angezeigt (es wird NOCH NICHTS verarbeitet)

(2) Das Formular wird abgeschickt. Der User hat einen Code eingegeben, der jetzt ausgewertet wird. Aber womit wird er denn verglichen? Mit einem NEU generierten Zufallswert!

Klar soweit?

greez 8)
JoSsiF

Jetzt verstehe ich so langsam, was du meinst, ich schau mal eben nach einer Lösung.
Habe das jetzt mal ein wenig umbebaut und herausgefunden, dass ich $rd im zweiten Teil nicht mehr gebrauchen kann (Wie du schonn sagtest) Doch wie komme ich nun an meine Zahl ran? Guck dir das hier nochmal an, is doch im Grunde der gleiche Sachverhalt und sollte somit das gleiche Problem verursachen, oder?

<?php $rd rand(0,3);
             
$pics glob("./gb/*.jpg");
             
$werte=array("3e42R","8hlnQ","a7pYD","W6j8v");
         
?>

         <img src="<?php echo $pics[$rd]; ?>" alt="Code">
<input type="submit" value="Eintragen" name="absenden">

         <?php
    
if(isset($absenden)){
         if(
$codefeld == $werte[$rd]){
    
.....}
         else {echo
"<b>Falscher Zahlencode!</b><br><br>";}
         }
« Letzte Änderung: 30.10.07, 06:58:45 von Dark_Dog »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
is doch im Grunde der gleiche Sachverhalt und sollte somit das gleiche Problem verursachen, oder?

Wie wär's, wenn du tatsächlich mal 'ne Änderung im Code vornimmst, anstatt dich im Kreis zu drehen? ;D

Jaja, habe rausgefunden, dass ich $rd im 2ten teil nicht mehr verwenden kann, da es sonst beim posten neu generiert wird. Nun gibt es da 2 Dinge:

1)Wieso geht es beim anderen Script
2)Wie kann ich dennoch an meine zahl rankommen, soll ich sie vllt. in einer DB oder Textdatei-abspeichern?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
1)Wieso geht es beim anderen Script

Vielleicht Zufall. Du hattest glaub ich auch weniger Werte drin, damit hast du 'ne höhere Chance, dass derselbe Wert wiederkommt.

2)Wie kann ich dennoch an meine zahl rankommen, soll ich sie vllt. in einer DB oder Textdatei-abspeichern?

Das wäre aber ein ziemlicher Umweg, wenn auch denkbar. Ich würd's über eine Session machen. Aber da du ja den Captcha-Code im Quellcode bereits mitlieferst, nämlich über den Bildnamen, könntest du theoretisch auch gleich noch ein Hidden Field zum Durchschleifen des Codes verwenden ;D

Hmmm, da das durchaus noch unerfahrenes Gebiet ist, werde ich mir wohl was ganz anderes Einfallen lassen müssen...
Damit hätte sich das Thema hier erledigt...


« Kontaktformular -> Mehr Sicherheit durch Captcha ?Problem mit Blaze Ftp »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
PHP
PHP steht für Personal Home Page und ist eine Skriptsprache die meist verwendet wird zur dynamischen Erzeugen von Internetseiten. PHP zeichnet sich durch die weite D...

Quellcode
Ein Quellcode, auch als Quelltext bekannt, bezeichnet den unkompilierten Programm-Code einer Software. Quell- oder Programm-Code ist der auch für Menschen lesbare Co...

Unicode
Unicode ist ein international anerkannter Standard, der als universeller Zeichencode ("Universal Code") dient und durch das Unicode-Konsortium entwickelt und verwaltet wi...