Ankündigung

Einklappen
Keine Ankündigung bisher.

mit ajax captcha neu laden und generieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mit ajax captcha neu laden und generieren

    huhu liebe Leute,
    Ich habe ein merkwürdiges Problem und weiß einfach nich woran es liegt
    ich generiere ein captcha klappt alles super, zeige es auf der seite an und habe da einen link gemacht auf den man klicken soll wenn man das captcha nicht erkennt, dieses wird per ajax neu geladen und die captcha.php neu ausgefüht. das merkwürdige ist bei dem klicken auf den link macht er es manchmal, manchmal aber passiert garnix nun weiß ich nicht ob es am php code des captchas lkieght das es einfach zu ineffizient ist oder ob ich einen fehler in meinem javascript habe ich bitte daher um eure hilfe.
    Quelltext:

    erst das des captchas:

    PHP-Code:
    /* Create Capctha */
    $str_array = array("A""C""F""H""J""L""N""P""S""U""V""X""Z""B""D""F""H""J""L""N""P""Q""S""U""W""Y"123456789);

    $ttfarr = array();
    /*ttf array dynamisch generieren*/
    $ordner dirname(__FILE__)."/../library/ttf/";
    $handle opendir($ordner);
    while (
    $file readdir($handle))
           if(
    $file != "." && $file != ".." && !is_dir($ordner."/".$file))
               
    $ttfarr[] = $file;
    closedir($handle);

    $char_seq "";

    for(
    $i 0;$i 5;$i++) {
        
    $int = (int)rand(0count($str_array)-1);
        
    $char_seq .= $str_array[$int];
    }


    $num_chars 4;
    $width 250;
    $height 100;
    $img imagecreatetruecolor($width $height);
    imagealphablending($img1);
    imagecolortransparent($img);
    // generate background of randomly built ellipses
    for ($i 1$i <= 55$i++) {
        
    $r round(rand(0100));
        
    $g round(rand(0100));
        
    $b round(rand(0100));
        
    $color imagecolorallocate($img$r$g$b);
        
    imagefilledellipse($imground(rand(0$width)), round(rand(0$height)), round(rand(0$width 16)), round(rand(0$height 4)), $color);
    }

    $start_x round($width $num_chars);
    $max_font_size $start_x;
    $start_x round(0.5 $start_x);
    $max_x_ofs round($max_font_size 0.9);
    // set each letter with random angle, size and color

    for($i=0;$i<=5;$i++)
    {

        
    $r = (int)rand(127255);
        
    $g = (int)rand(127255);
        
    $b = (int)rand(127255);
        
    $y_pos = ($height 2) + (int)rand(520);

        
    $fontsize = (int)rand(23$max_font_size);
        
    $color imagecolorallocate($img$r$g$b);
        
    $presign = (int)rand(01);
        
    $angle round(rand(025));
        if (
    $presign == true$angle = -$angle;

        
    $randttf round(rand(0count($ttfarr)-1));
        
    $ttf $ordner $ttfarr[$randttf];
        
    $x =  $start_x $i $max_x_ofs+7;
    ImageTTFText($img$fontsize$angle,$x$y_pos$color,$ttfsubstr($char_seq$i1));
    }
    // create image file
    imagejpeg($img,dirname(__FILE__)."/../library/images/captcha.jpg",65);
    flush();
    imagedestroy($img);
    /* Captcha End */ 
    nun der javascript

    Code:
    function refreshCaptcha()
    {
    //globale Instanz von XMLHttpRequest
    var xmlHttp = false;
    
    //XMLHttpRequest-Instanz erstellen
    //... für Internet Explorer
    try {
        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try {
            xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e) {
            xmlHttp  = false;
        }
    }
    //... für Mozilla, Opera, Safari usw.
    if (!xmlHttp  && typeof XMLHttpRequest != 'undefined') {
        xmlHttp = new XMLHttpRequest();
    }
    
    if (xmlHttp) {
         xmlHttp.open('GET', './libs/captcha.php?param=1', true);
         xmlHttp.onreadystatechange = function () {
             if (xmlHttp.readyState == 4) {
            captcha = new Image();
            captcha.src = "./library/images/captcha.jpg";
            document.getElementById("captcha").src = captcha.src;
    		//document.getElementById("asb_content").innerHTML = xmlHttp.responseText;
             }
         };
         xmlHttp.send(null);
     }
    
    }
    ich würde mich auch um optimierungen freuen

    mit freundlichen grüßen Jörg

  • #2
    Hallo und willkommen hier im Forum!

    Ob der Fehler an PHP oder JavaScript liegt, kannst du rausfinden, in dem Du statt JavaScript den Request anstößt. 20x hintereinander. Dann siehst du ja ob es angezeigt wird.

    Übrigens, für Zeile 1 kannst du auch range() verwenden, Ordner liest man mittlerweile mit glob() aus und das Captcha Site-weit in der selben Datei speichern ist auch nicht so geschickt. Gleichzeitige User überschreiben die Datei, es könnte zu Zugriffsverletzungen kommen. Lieber eine captcha.php erzeugen, die das erstellte Bild gleich anzeigt und den Text in die Session schreibt. Da fällt mir auf, wo speicherst du dein erzeugtes Wort eigentlich zum späteren Vergleich ab ..

    Kommentar


    • #3
      huhu danke erstmal
      wie meinst du das mit dem anstoßen??
      die funktionen die du erwähnst werde ich mir mal anschauen, mit dem bild als php datei ahst du recht werde ich machen,
      ich wollte den text der im captcha steht base64 kodiert in ein hidden feld schreiben und ein 2. hidden feld mit einem anderen unrelevanten key eine id oder irgendwas und wollte das wie eine art user passwort auswerten.

      wie würdest du das denn machen?

      Kommentar


      • #4
        Mit Sessions.

        anstoßen = im Browser aufrufen

        Kommentar


        • #5
          eigentlich müsste es doch reichen, wenn man das bild "einfach" neu läd (ohne ajax), da der source der die session generiert beimm erstellen des bildes sowieso aufgerufen wird ? demnach bringt das anstupsen via ajax nix, weil es eh aufgerufen wird wenn es neu geladen wird.

          Kommentar


          • #6
            huhu
            habe jetzt so gemacht das es eine php datei ist mit content type image/jpeg
            aber der witz ist wenn ich die php datei im browser aufrufe klappt es auch beim aktualisieen kommt ein neuer code wenn ich jetzt mit javascript nur das bild neu lade passiert nix....
            könnt ihr euch mal meinen javascript code ansehen vielleicht habe ich auch einen fehler

            Code:
            function refreshCaptcha()
            {
                    captcha = new Image();
                    captcha.src = "./libs/captcha.php";
                    document.getElementById("captcha").src = captcha.src;
            }
            aufrufen tu ich es so :

            Code:
            <div id='captcha' OnClick='javascript:refreshCaptcha();'> neu laden</div>

            Kommentar


            • #7
              Wie es passiert nix? Was steht in der JavaScript-Konsole?

              Kommentar


              • #8
                in der konsole steht nix drin,
                mh das problem liegt daran das er das bild nicht refresht da der pfad der selbe ist :/
                vermute ich

                Kommentar


                • #9
                  Achso, dann häng einen zufälligen Parameter an den Aufruf, dann holt er sich die Grafik nicht aus dem Cache.

                  Kommentar


                  • #10
                    ja danke jetzt gehts
                    erzeuge nun per javascript eine zufälige zahl und lade danndamit das captcha juhu
                    zergling sol ich zu captchas mal ein tutorial schreiben
                    also so was ist captcha ... wie funzt es usw.??


                    viele grüße Jörg

                    Kommentar


                    • #11
                      Gerne!

                      Kommentar

                      Lädt...
                      X