Ankündigung

Einklappen
Keine Ankündigung bisher.

Text-Captcha

Einklappen

Neue Werbung 2019

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

  • Text-Captcha

    Hi,

    das hier ist mein erster Post und ich bin noch relativ unerfahren.
    Jetzt fragt ihr euch warum ich in der profi section posste, das ist weil
    ich probleme mit einem php code habe der schon wesentlich mehr als
    anfänger wissen braucht.

    also es geht um text-captcha, das sind die sicherheits codes, die vor spambots schützen, ich hab da eine gute variante in reinem php gefunden und will sie verwenden,

    Jetzt habe ich ein formular indem der benutzer alles eintippt und abschickt dann wird überprüft ob felder leer sind, die passwörter nicht übereinstimmer, oder eben der captcha code falsch ist :

    PHP-Code:
    $username $_POST["username"];
    $password $_POST["password"];
    $password2 $_POST["password2"];
    $code $_POST["code"];
    if(
    $password != $password2 OR $code != $n->getNum() OR 
    $username == "" OR $password == "" OR $code == ""
    geht alles bist auf "$code != $n->getNum()"
    ohne das geht alles perfekt, nur wenn ich das einfüge nimmt er es nicht,
    ich denke das "$n->getNum()" nicht die captcha zahl ist, oder so, und somit immer FALSE bei der if abfrage rauskommt.

    Ich habe keinen plan wie ich diese abfrage sicher rein bekommt, wäre nett wenn einer helfen kann.

    der ganze code des captcha scripts steht unten.

    mfg der blade



    PHP-Code:
    <?php
    # Von Rene Schmidt (rene@reneschmidt.de) fuer DrWeb.de

    // Diese Klasse erzeugt EINE Ziffer
    class Digit {

      
    // Die Zweierpotenzen sind hier schon berechnet notiert, damit sie nicht jedes Mal neu
      // ausgerechnet werden muessen. Wir benoetigen fuer eine 5x3-Matrix, deren Zellen mit
      // Zweierpotenzen maskiert sein sollen 15 Bits, also die Bitmasken 2^0 bis 2^14
      
    var $bits = array(1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384);

      
    // Dieses Array enthaelt die Zeilen einer Ziffer, deren Zellen wiederum als Array dargestellt werden
      // Siehe Konstruktor
      
    var $matrix  = array();

      
    // Dies sind die fertig berechneten Bitmasken der Ziffern 0 bis 9 in Dezimaldarstellung
      
    var $bitmasks = array(31599187402960731143189213118331695188553172731215);

      
    // Konstruktor; nimmt die darzustellende Ziffern entgegen; Matrix wird initialisiert
      // setMatrix() wird mit der korrekten Bitmaske der darzustellenden Ziffer aufgeruefen
      
    function digit$dig ) {
        
    $this->matrix[] = array(000); // 2^0, 2^1, 2^2 ... usw.
        
    $this->matrix[] = array(000);
        
    $this->matrix[] = array(000);
        
    $this->matrix[] = array(000);
        
    $this->matrix[] = array(000); // ..., ..., 2^14

        
    ((int)$dig >= && (int)$dig <= 9) && $this->setMatrix$this->bitmasks[(int)$dig] );
      }

      
    // Methode erzeugt anhand der Bitmaske die Matrix der Ziffer
      // Vom Konstruktor erhaelt die Methode die Bitmaske der darzustellenden Ziffer
      
    function setMatrix$bitmask ) {
        
    $bitsset = array();

        
    // Jetzt wird jedes Bit daraufhin geprueft, ob es zur Bitmaske gehoert
        // Wenn ja, wird es im Array $bitset gespeichert
        
    for ($i=0$i<count($this->bits); ++$i)
          ((
    $bitmask $this->bits[$i]) != 0) && $bitsset[] = $this->bits[$i];

        
    // Nun wird die initialisierte und leere Matrix hergenommen und Zeile fuer Zeile und Zelle fuer Zelle
        // bestueckt. Zellen, die leer sein sollen, bleiben auf 0, aktivierte Zellen erhalten den Wert 1
        // Beispiel aus dem Konstruktor - die Ziffer 1 wuerde als Matrix so aussehen:
        //     $this->matrix[] = array(0, 0, 1); // 2^0, 2^1, 2^2 ... usw.
        //     $this->matrix[] = array(0, 1, 1);
        //     $this->matrix[] = array(0, 0, 1);
        //     $this->matrix[] = array(0, 0, 1);
        //     $this->matrix[] = array(0, 0, 1); // ..., ..., 2^14
        
    foreach($this->matrix AS $row=>$col)
          foreach(
    $col AS $cellnr => $bit)
            
    in_arraypow(2,($row*3+$cellnr)), $bitsset) && $this->matrix[$row][$cellnr] = 1;
      }
    }

    // Diese Klasse kuemmert sich um die korrekte Darstellung mehrerer Ziffern (also einer Zahl)
    class Number {

      var 
    $num 0// Zahl, die dargestellt werden soll
      
    var $digits = array(); // Enthaelt spaeter fuer jede Stelle ein Digit-Objekt

      // Konstruktor; nimmt direkt die darzustellende Zahl entgegen.
      
    function number$num ) {
        
    $this->num = (int)$num// Zur Sicherheit in ganze Zahl umwandeln

        
    $r "{$this->num}"// In Zeichenkette konvertieren

        // Jetzt fuer jede Stelle der Zahl ein Digit-Objekt erzeugen
        
    for( $i=0$i<strlen($r); $i++ )
          
    $this->digits[] = new Digit((int)$r[$i]);
      }

      
    // Liefert einfach die Zahl, die dargestellt wird.
      
    function getNum() { return $this->num; }

      
    // Gibt die Zeilen aller Ziffern nacheinander aus; also erst alle ersten, dann alle zweiten Zeilen usw.
      
    function printNumber() {
        for(
    $row=0$row<count($this->digits[0]->matrix); $row++) {
          foreach( 
    $this->digits AS $digit ) {
            foreach(
    $digit->matrix[$row] AS $cell)
              if(
    $cell === 1// 1 bedeutet, die Zelle soll aktiv sein (=schwarz)
                
    print("<span class=\"s\">&nbsp;&nbsp;</span>");
              else
                print(
    "<span class=\"w\">&nbsp;&nbsp;</span>");
            print(
    "<span class=\"w\">&nbsp;</span>"); // Leerraum zwischen den Ziffern
          
    }
          print(
    "<br>"); // Naechste Zeile
        
    }
      }
    }

    ?>

    <html>
    <head>
    <style>
        .s { color: black; background-color: black; }
        .w { color: white; background-color: green; }
    </style>
    </head>
    <body>
    <h2>Beispiel</h2>
    <div >
    <?php
    $n 
    = new Numberrand(1000,9999) );
    $n->printNumber();
    printf"<h2>Dargestellt wird die Zahl %d</h2>"$n->getNum() );
    ?>
    </div>

    </body>
    </html>


  • #2
    Hallo bl4de,
    die Code-Beispiele die du gepostet hast lassen nirgendwo auf ein Captcha-Script schließen....
    Du hast ja selbst schon gemerkt, dass der vom Benutzer übergebene Code ($_POST['code']) nicht gleich dem aus $n->getNumber() ist. Wahrscheinlich weil du dafür jedesmal eine neue Zufallszahl generierst...aber wie gesagt: Das ist aus deinem Code so nicht ersichtlich.
    Create your own quiz show.

    Kommentar


    • #3
      Was Captchas angeht, habe ich auf meiner Seite mal einen kleinen Artikel geschrieben: Barrierefreie_CAPTCHAs
      Die Methode ist meines Erachtens die einfachste Methode, Bots abzuhalten. Dazu bekommt der User davon nichts mit.
      Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

      Kommentar


      • #4
        @agrajag
        das ganze ist ein captcha script, weil es funktioniert !!, nur das überpfüfen der zahl geht nicht, generiert wird diese aber einwandfrei, und so das man sie nicht auslesen kann, zumindest nicht so easy

        und hiermit füge ich das ganze ein:
        klappt auch bei nem test:
        PHP-Code:
        <?php
        $n 
        = new Numberrand(1000,9999) );
        $n->printNumber();
        printf"<h2>Dargestellt wird die Zahl %d</h2>"$n->getNum() );
        ?>
        "$n = new Number( rand(1000,9999) );
        $n->printNumber();"
        das generiert die zufalls zahl mit pro ziffer 3x5 felder, funktioniert auch!

        "
        printf( "<h2>Dargestellt wird die Zahl %d</h2>", $n->getNum() );"
        damit zeigt er die zahl im klartext an, und die zahl im klartext brauche
        ich zum überpfrüfen, was wie gesagt nicht geht.




        @manko10 ja ist ned mal eine so dumme idee, aber passt mir sowas ned,
        nicht böse gemeint, klappt bestimmt und ist ein netter trick ,
        aber es soll einfach ne simple captcha abfrage sein, und fertig

        sollte es wirklich einfach nur spimple sein und nur funktionell, dann
        nehm ich ein paar zeilen java script und für irgend was fertiges sein.

        Kommentar


        • #5
          Ja klar, kein Problem. Jedem das seine.
          Aber ehrlich gesagt ist die von mir vorgeschlagene Methode noch einfacher. Es muss weder etwas zufälliges generiert noch irgendetwas gespeichert werden. Lediglich ein Feld, dass für den normalen User noch nicht mal sichtbar ist.
          Ich will dich jetzt nicht gegen deinen Willen überzeugen, aber dennoch versuche ich immer wieder diese Methode einzubringen, damit die Ära der normalen Captchas vielleicht irgendwann mal ein Ende hat.
          Refining Linux: “Performing Push Backups – Part 1: rdiff-backup

          Kommentar


          • #6
            Zitat von bl4de Beitrag anzeigen
            @agrajag
            das ganze ist ein captcha script, weil es funktioniert !!
            Hä? Ich dachte du bist hier weil es nicht funktioniert
            Ich sage ja auch nciht, dass das ganze nicht irgendwie zu einem captcha-script gehören kann.....
            und hiermit füge ich das ganze ein:
            klappt auch bei nem test:
            PHP-Code:
            <?php
            $n 
            = new Numberrand(1000,9999) );
            $n->printNumber();
            printf"<h2>Dargestellt wird die Zahl %d</h2>"$n->getNum() );
            ?>
            "$n = new Number( rand(1000,9999) );
            $n->printNumber();"
            das generiert die zufalls zahl mit pro ziffer 3x5 felder, funktioniert auch!

            "
            printf( "<h2>Dargestellt wird die Zahl %d</h2>", $n->getNum() );"
            damit zeigt er die zahl im klartext an, und die zahl im klartext brauche
            ich zum überpfrüfen, was wie gesagt nicht geht.
            Du hast immernoch nicht den relevanten Code gepostet.

            Irgendwo musst du ja schließlich die generierte Zahl _speichern_ um sie dann nachdem der User das Formular abgeschickt hat mit der Eingabe des Users zu vergleichen....
            Create your own quiz show.

            Kommentar


            • #7
              Ja genau

              sorry das ich so undeutlich war zum ferlgeichen der benutzereingabe ($code)
              mit der zahl muss ich die zufalls zahl einer variable zuweisen, und genau das klappt nicht, hab leichte schwierigkeite zum ziel zu kommen

              sry dafür

              mfg der blade

              Kommentar


              • #8
                Zitat von bl4de Beitrag anzeigen
                sorry das ich so undeutlich war zum ferlgeichen der benutzereingabe ($code)
                mit der zahl muss ich die zufalls zahl einer variable zuweisen, und genau das klappt nicht, hab leichte schwierigkeite zum ziel zu kommen
                Und ich hab leichte Schwierigkeiten dich zu verstehen

                Du generierst einen zufälligen Code (der captcha-code) der dann durch dieses Script wie auch immer angezeigt wird , den soll der User dann abtippen und in das Feld "code" eintragen. Auf der nächsten Seite willst du jetzt prüfen, ob der Eingegebene Code (der jetzt in $_POST['code']) steht dem entspricht was ihm vorhin angezeigt wurde. Richtig?

                Dazu musst du den captcha-code irgendwie auf die zweite Seite übertragen. Üblicherweise per $_SESSION...
                Davon sehe ich in deinem Code aber nichts. Woher kommt also auf der zweiten Seite (die Seite mit den Überprüfungen) die Zahl/Nummer/code?
                Create your own quiz show.

                Kommentar


                • #9
                  genau das wollte ich vo neuch wissen
                  und falls es hilft, der php code und das formular steht in einer datei , also sendet es die daten an sich selbst.

                  Kommentar


                  • #10
                    das problem ist:
                    PHP-Code:
                    printf"<h2>Dargestellt wird die Zahl %d</h2>"$n->getNum() ); 
                    hier wird wohl eine zahl erzeugt

                    PHP-Code:
                    $n->getNum() 
                    hier wird eine andere erzeugt.
                    du musst das explizit speichern du kannst net erwarten das eine klasse die zufallszahlen generiert das genau in dem moment bleiben lässt in dem du das willst und zufällig die gleiche wie vorhin erzeugt

                    schreib das ding in die session und frage die session ab.

                    PHP-Code:
                    $_SESSION['captchacode'] = $n->getNum();
                    printf "Blablubber Code bla" $_SESSION['captchacode'] ); 
                    -- später --
                    PHP-Code:
                    if ($code == $_SESSION['captchacode'] ) { print "wo du hast dir die mühe gemacht die zahl zu lesen }; 

                    Kommentar


                    • #11
                      Hi,

                      das hier ist mein erster Post und ich bin noch relativ unerfahren.
                      Jetzt fragt ihr euch warum ich in der profi section posste, das ist weil
                      ich probleme mit einem php code habe der schon wesentlich mehr als
                      anfänger wissen braucht.
                      Das sieht mir eher nach einem Grundlagenproblem aus, als ein kompliziertes "Profi" Problem. *SCNR*

                      Gruß Thomas

                      Kommentar


                      • #12
                        Hallo,

                        Eine Captcha-Component findest du in Brickoo.
                        https://sourceforge.net/projects/brickoo/
                        Das ist ein sehr einfach zu bedienendes PHP-Framework mit einer Vielfalt an Funktionalität.

                        Ein Beispiel liegt dem Packet auch bei.

                        MfG

                        Hroudtwolf
                        Computer-Training kostenlos, gemeinnützig bis günstig.

                        Kommentar


                        • #13
                          Zitat von Manko10 Beitrag anzeigen
                          Was Captchas angeht, habe ich auf meiner Seite mal einen kleinen Artikel geschrieben: Barrierefreie_CAPTCHAs
                          Die Methode ist meines Erachtens die einfachste Methode, Bots abzuhalten. Dazu bekommt der User davon nichts mit.
                          habe die methode gerade in mein formular eingebaut und war auch echt sehr einfach und klappt super

                          Habe das Feld mal ausgesfüllt -> Große Fehlermeldung

                          Sehr schön! Aber Manko10 wie meinst du das, dass man das Feld nicht immer gleich nennen soll? Meinst du wenn man mehrere Formulare hat?

                          Kommentar

                          Lädt...
                          X