Ankündigung

Einklappen
Keine Ankündigung bisher.

Gleichungs Captcha PHP

Einklappen

Neue Werbung 2019

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

  • Gleichungs Captcha PHP

    Hallo Leute!

    Als erstes vornweg,dies ist mein aller erstes Tut überhaupt und ich hoffe ich schreibe es gut! Es wird dafür sicher viele andere und auch bessere Möglichkeiten geben dieses auszubauen. Ich habe mir hier ein ganz einfaches und simples Captcha geschrieben in der Art einer Gleichung. Ich eine Gleichung für besser,weil ein einfacher Zufallscode vieleicht doch zu einfach ist.

    Spambots versuchen alle Felder in einem Fprmular auszufüllen und das auch ziemlich schnell (Ich glaube in Millisekunden,bin mir aber nicht sicher)!
    In Form einer Gleichung haben es diese Bots aber schwer denn man braucht Zeit um diese auszurechnen und dann auch ein zu tippen,zuviel Zeit für einen Bot!

    Genug der langen Rede fangen wir an!

    Also als erstes legen wir uns mal zwei Dateien an, die eine nennen wir captcha.php und die andere formular.php (natürlich optional)!

    So nachdem wir das gemacht haben erstellen wir uns in einem Grafik Programm ein png Bild (natürlich gehen auch andere Formate) und nennen dieses captcha_bg.png (optional)! Und natürlich eine Schriftdatei müssen wir uns in dem Verzeichnis wo wir unsere angelegten Dateien und das Bild rein gespeichert haben auch noch rein speichern. Dazu könnt einfach aus dem dem Ordner eures Systems eine Datei in euer Verzeichnis rein kopieren, ich habe mich für tahoma.ttf entschieden! Ihr könnt euch auch was anderes suchen,aber beachtet bitte nicht alle Schriftformate unterstützen Zeichen wie + oder =. Also testet das in einem Grafikprogramm vorher einfach aus ob das in der Schriftart unterstützt wird!

    So und nun kommen wir zum Code,denn ich denke an Vorinfos reicht das aus!

    Als erstes schreiben wir uns eine Funktion die uns einen zufälligen Wert generiert!

    Funtion:
    PHP-Code:
    //Wichtig denn der Ergebnis wert wird anschliesend in einer Session Var
    //gespeichert
    session_start();
     
    //Funktion um Gleichungsteile zu erstellen
    function generate_gleichung($length1 3)
    {
        
    $char1 array_merge(
            
    range(19)//Nur Zahlen 1-9 also keine 0
        
    );
        
    shuffle($char1);
        return 
    implode(''array_slice($char10$length1));

    Ich nenne diese Funktion einfach generate_gleichung!
    Den Parameter $legth1 = 3 sagt das ein Zufallswert maximal 3 Zeichen haben darf!
    Dann benutze ich die Funktion
    PHP: array_merge - Manual
    und setze in der php funktion PHP: range - Manual
    die Art der Zeichen fest die Vorkommen darf,da sies eine Gleichung ist beschränken wir uns auf Zahlen von 1 - 9. Natürlich kann man dann auch tief in die Mathematick gehen und x Gleichungen oder so erstellen,aber macht das wirklich Sinn?
    Nachdem wird das gemacht haben nutzen wir die php funktion
    PHP: shuffle - Manual
    Anschlisend generieren bzw. bilden wir uns dann unseren String dazu nutzen wir die Funktionen
    PHP: implode - Manual
    PHP: array_slice - Manual
    So damit haben wir die Funktion fertig! Nun wollen dazu kommen zwei Gleichungsteile zu erstelle mit denen dann natürlich auch ein Ergebnis erstellt werden kann was anschliesend dann den Code ergibt der eingegeben werden muss!

    Code um die Gleichungsteile zu erstellen!
    PHP-Code:
    //Ersten Gleichungsteil erstellen
    $teil1 generate_gleichung(rand(2,3));//Erster Gleichungsteil min 2 Zeichen max. 3 Zeichen
    //Ersten Gleichungsteil erstellen
    $teil2 generate_gleichung(rand(2,3));//Erster Gleichungsteil min 2 Zeichen max. 3 Zeichen 
    Wie ihr seht nutzen wir auch da wieder eine Funtion von php nämlich
    PHP: rand - Manual
    Wir erstellen also zwei Variablen eine $teil1 und eine $teil2! Bei diesen Variablen bringen wir auch unsere Funktion generate_gleichung zum Einsatz! Mit der Funktion rand(2,3) bilden wir dann einen String der je nach Zufall 2 oder auch 3 Zaichen haben kann!

    So nun haben wir also auch unsere Gleichungsteile generiert und können nun eine Aufgabe erstellen die die Gleichung bildet!

    Gleichungs Code:
    PHP-Code:
    //Ergebnis in Session speichern
    $_SESSION['resultat'] = $teil1 $teil2;//Ergebnis der Gleichungsteile errechnen 
    Das Ergebniss der Gleichung speichern wir in einer SESSION Variablen damit arbeiten wir dann auch im anschliesenden Formular! Wie ihr die SESSION Variable nennt und bezeichnet ist völlig Wurscht!

    So nun haben wir den Teil der Gleichung geschafft und das Ergebnis steht!

    Kommen wir nun zum Teil des Bildes denn wir wollen das ja dann grafisch darstellen. Nun gut dann los fangen wir an!

    Einen Strin ertsellen der die Gleichung enthält und im Bild eingesetzt wird!
    PHP-Code:
    //string fürs Bild
    $string $teil1." + ".$teil2." ="
    Hier machen wir nichts besonderes die Gleichung wird eigentlich nur in einer Variablen $string gespeichert!

    Nun kommen wir dazu das png Bild mit PHP zu erzeugen!
    PHP-Code:
    //Png Captchabild darstellen
    $png imagecreatefrompng("captcha_bg.png"); 
    Dazu nutzen wir die php Funktion
    PHP: imagecreatefrompng - Manual
    und speichern das Ergebnis in der Variablen $png

    Als nächstes legen wir fest wie unser Imagestring (unsere Gleichung) ausschauen soll!
    PHP-Code:
    //Hier den Gleichungsstring formatieren
    $Textfarbe imagecolorallocate($png25500); 
    Hier nutzen wir die Funktion
    PHP: imagecolorallocate - Manual
    Wir müssen hier nun wieder die Variable $png zum Einsatz bringen da ja in der Variablen unser erzeugtes png Bild steckt und auf dieses soll ja unser Gleichungsstring gelegt werden!
    Normal werden ja Farbwerte Hexadezimal geschrieben nun in PHP geht das nicht da wird der Hexawert in drei Teilen Dezimal dargestellt!
    Der Rot Heawert sieht so aus ff0000 und in der Funtion so dargestellt!
    255,0,0
    An diese Werte kommt ihr einfach über euren System Rechner. Aller 2 Hexacode stellen wird ein Dezimalwert erstellt! Ihr habt in euren Sytem Rechnung die Funktion Hexateile in Dezimalteile umzurechnen!

    So und nun legen wir unseren Gleichungsstring auf das png Bild!
    PHP-Code:
    //Hier legen wir den Img String auf unser Bild
    imagettftext($png1531030$Textfarbe"tahoma.ttf"$string); 
    Hier nutzen wir die Funktion
    PHP: imagettftext - Manual
    Auch hier kommt wieder die Variable also unser erzeugtes png Bild zum Einsatz! In dieser Funtion können wir nun die Positionierung unseres Gleichungsstrings festlegen und einstellen!

    Ich will die einzelnen Einstellungsparameter mal kurz darstellen!
    15 = Schriftgröße des Strings
    3 = Schräglage des Strings (ist die Null liegt er Waagerecht)
    10 = Textausrichtung links (left)
    30 = Textausrichtung in der Höhe (top)

    So nun sind wir damit fertig und müssen nun nur noch unser Bild ausgeben! Dazu nutzen wir noch den header Content Type!
    PHP-Code:
    header("Content-type: image/png");
    imagepng($png);
    imagedestroy($png); 
    Dazu nutzen wir die Funktionen
    PHP: imagepng - Manual
    PHP: imagedestroy - Manual

    So nun das war es und das Bild und der Code für ein Captcha ist fertig. Nun müssen wir den nur noch in einem Formular einbinden und dazu kommen wir jetzt!

    Hier der Code der formular.php
    PHP-Code:
    <?php
    error_reporting
    (E_ALL);
    session_start();
    if(isset(
    $_POST['send']))

     if(
    $_SESSION['resultat'] != $_POST['code'])
     {
      echo 
    "Der Code ist nicht korrekt,bitte noch mal!<br>
       <a href=\"formular.php\">Zurück</a>"
    ;
      exit();
     }
     else
     {
      
    header("Location: formular.php");
     }
    }
    ?>
    <form action="<?php echo $_SERVER['PHP_SELF'?>" method="post">
    <img src="captcha.php" border="0" title="Captcha"><br /><br />
    Bitte das Gleichungsergebnis in das Feld eintragen!<br />
    <input type="text" name="code" style="width: 50;">
    <input type="submit" name="send" value="Checken">
    </form>
    Als erstes müssen wir die Datei mit session_start(); beginnen weil ja unser Ergebniscode in einer Session Variablen gespeichert ist und um den wieder verwenden zu können müssen eine session starten!
    Auf den Formulatteil speziell möchte ich jetzt nicht eingehen sondern nur das was das Captcha angeht!

    In diesem Block hier!
    PHP-Code:
    if($_SESSION['resultat'] != $_POST['code'])
     {
      echo 
    "Der Code ist nicht korrekt,bitte noch mal!<br>
       <a href=\"formular.php\">Zurück</a>"
    ;
      exit();
     }
     else
     {
      
    header("Location: formular.php");
     } 
    machen wir nun einen Vergleich der aussagt wenn unser Ergbnis aus der Gleichung nicht mit dem eingegeben im Textfeld übereinstimmt dann gib eine Warnung aus oder wenn es passt dann schicke ab und letie weiter!

    So zum Abschluss seht ihr noch wie ihr das Captcha einbinden könnt!

    PHP-Code:
    <form action="<?php echo $_SERVER['PHP_SELF'?>" method="post">
    <img src="captcha.php" border="0" title="Captcha"><br /><br />
    Bitte das Gleichungsergebnis in das Feld eintragen!<br />
    <input type="text" name="code" style="width: 50;">
    <input type="submit" name="send" value="Checken">
    </form>
    Ihr legt also in eurem Formular ein Feld fest in das ihr dann das Ergebnis eingebt und ihr seht auch das in dem Html üblichen Tag für ein Bild nämlich <img src=""> in dem src Teil die captcha.php drin liegt!

    Warum eine Datei in einm img einfügen? Nun ja in dieser PHP Datei ist ja ein Bild erstellt also sie stellt auch nur ein Bild dar,darum können wir diese auch da in den src Teil einbinden!


    So das wars. Ich hoffel euch ein interessantes Tutorial geboten zu haben und das es euch ein wenig hilft!

    mfg der Litter
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    [URL]http://www.lit-web.de[/URL]

  • #2
    Ist sicherlich hilfreich für Anfänger, welche diese Funktionen mal in einer Anwendung sehen wollen, wirklich einbauen würde ich dieses Captcha nicht.
    Gründe:
    - Nicht jeder ist fähig, zweistellige oder sogar dreistellige Zahlen im Kopf zu addieren. Es gibt einige die die Seite vorher verlassen werden.
    - Aus dem Standpunkt, dass Captchas sowieso nicht unbedingt ideal sind (Hinsichtlich der Problem mit z.B. Screenreadern) verschärft dieses Captcha noch zusätzlich diese Problematik.

    Was du hingegen unbedingt noch korrigieren solltest:
    - Die Funktion generate_gleichung ist Overflow. Ein einfaches rand(10,999) hätte gereicht. Ich vermute, du willst keine 0 einsetzen, weil du dann nicht kontrollieren kannst, ob die 0 bereits an erster stelle kommt, und dir somit eine Zahl kleiner der Anzahl stellen liefert, die du möchtest. Dieses Problem hast du mit rand(10,999) nicht .
    - Den Content-type-Header solltest du bei der Ausgabe des Bildes mitliefern
    - Bleib einheitlich mit der Benennung von Variablen und Funktionen. Entweder englisch, oder deutsch, aber sowas wie: generate_gleichung ist nicht schön .
    - Der Header "Location" erwartet eine absolute URI, inkl. Schema. Deine angabe ist daher nicht gültig und es ist nicht definiert, was damit passiert (Auch wenn einige Clients dies dennoch interpretieren).
    -
    PHP-Code:
    <?php echo $_SERVER['PHP_SELF'?>
    sollte nicht als action-Attrubut verwendet werden, da es empfindlich für XSS-Attacken ist.
    Besser wäre:
    PHP-Code:
    <?php echo htmlentities($_SERVER['SCRIPT_NAME']); ?>
    Oder ein leeres Action-Attribut.

    Kommentar


    • #3
      Hallo!

      Mit der header("Location:") hast du natürlich Recht Das Problem ist das ich das offline teste,wen ich was online Stelle mache ich das natürlich mit einer absoluten URL,dies ist mir bewust,hätte ich bei einem Tut natürlich beherzigen sollen!

      Nun ja über den Einsatz von Captchas lässt sich streiten und gibt es geteilte Meinungen darüber aber falsch ein solches einzusetzen ist es nicht! Und eine Gleichung die sich nur auf Addition beruht ist ja nicht schwer auszurechnen und das bei max 3 Stellen nicht wirklich ein Problem!

      Nun gut das mit der Funktion ist ja nun nicht falsch und wenn da deutsch und englisch zusammen gewürfelt sind such nicht wirklich schlimm!

      Das mit content header habe ich in der Tat vergessen und korrigiert!

      Aber danke für die Hinweis1
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      [URL]http://www.lit-web.de[/URL]

      Kommentar


      • #4
        Für kleinere sachen magst du recht haben, es macht aber durchaus sinn, sich von beginn weg einen sauberen Stil anzugewöhnen. Und dies erst recht bei einem Tutorial, man soll ja ein gutes Vorbild geben.
        gibt es geteilte Meinungen
        aber falsch ein solches einzusetzen ist es nicht!
        Ahja, mhm. Es gibt zwar verschiedene Meinungen, deine ist aber die richtige?
        Bitte lesen:
        WebDesign - Tips und Tricks: Captcha-Alternativen

        ok, rechne mir bitte 747+516 mal eben im Kopf. Da muss selbst ich meine Hirnzellen aktivieren.....ich kenne genügend Leute, die bei einer solchen Aufgabe nach spätestens 20 Sekunden aufgeben, entweder den Rechner zur Hand nehmen, oder die Internetseite einfach schliessen.

        Kommentar


        • #5
          Die Gleichung lässt sich ja Problemlos auf Zweistellige Komponenten eistellen! Recht haste dreis stellige Sachen sind zu viel. Aber wieso denn unsauber programmiert? Wo denn? Und das meine die richtige Meinung ist habe ich doch gar nicht gesagt,ich sagte nur es gibt geteilte Meinungen,nicht mehr und nicht weniger!
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          [URL]http://www.lit-web.de[/URL]

          Kommentar


          • #6
            Auch zweistellig ist nicht so einfach:
            76+67, na? .
            Und einstellige lassen Bots durch Probieren wieder durch (18 Möglichkeiten).
            Hast du den Link gelesen? Da steht genügend drin, wie man sowas besser machen kann .
            Unsauber Programmiert ist übertrieben, war nur auf deine Art, variablen und Funktionen zu benennen bezogen. So schlimm ists nicht, bin darin halt öfters ein Perfektionist.

            Den Textabschnitt solltest du villeicht auch noch überarbeiten:
            Spambots versuchen alle Felder in einem Fprmular auszufüllen und das auch ziemlich schnell (Ich glaube in Millisekunden,bin mir aber nicht sicher)!
            In Form einer Gleichung haben es diese Bots aber schwer denn man braucht Zeit um diese auszurechnen und dann auch ein zu tippen,zuviel Zeit für einen Bot!
            Mit der Zeit, hat dies nichts zu tun. Es geht eher darum, dass es schwierig (aber nicht unmöglich, siehe Links im oben genannten Link) ist ein Programm zu entwickeln, welches text aus einem Bild lesen kann. Hat es den Text gelesen, ist es eine Sache von Mikro- oder sogar Nannosekunden, eine entsprechende Rechnung auszurechnen. Von daher: Ob Text oder Rechnung ist eigendlich egal.

            Kommentar


            • #7
              Hallo,
              dein Captcha hat einen Vorteil gegenüber anderen Captchas: es ist noch nicht so weit verbreitet und wird deshalb von vielen Bots wohl missverstanden. Diese würden einfach die Zeichenfolge auf dem Bild in das Feld einfügen und das ganze absenden.
              Sobald deine Seite aber populärer wird oder andere diese Methode übernehmen, Bietet das Captcha keine Schutz mehr, zumal du eine gut leserliche Schrift benutzt hast. Eine Diskussion über Captchas mit gut lesbaren Schriften und wie leicht diese sich mit handelsüblichen OCR-Lösungen knacken lassen, habe ich bereits bei der Konkurrenz geführt: Gute Captchas - phpfriend.de

              Ich halte immer noch mehr zu den barrierefreien/-armen Varianten der Captchas. Selbst, wenn vielleicht ein Bot dran vorbeikommt, nützt ihm ein Spam-Post, in dem kein Spam stehen kann, weil alle erdenklichen Spam-Wörter gesperrt sind, herzlich wenig.
              Ein Verhältnis von Anzahl Links zu Anzahl Wörter, das ich erfolgreich einsetze, ist 1:20 (also 0.05).
              Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

              Kommentar


              • #8
                Ach was bin ich froh das ich fast nur fürs Intranet programmiere, da hab ich solche Probleme erst gar nicht

                Kommentar


                • #9
                  was haltet ihr denn von reCAPTCHA denkt ihr das wird auch irgendwann so wie captchas problemlos zu knacken sein?

                  Kommentar


                  • #10
                    Zitat von robydog Beitrag anzeigen
                    was haltet ihr denn von reCAPTCHA denkt ihr das wird auch irgendwann so wie captchas problemlos zu knacken sein?
                    Jedes Captcha wird früher oder später knackbar sein. Wenn sich etwas (noch) nicht automatisiert komplett vom Computer lösen lässt dann nutzt man eben Tricks wie das Captcha einfach zu "kopieren" und bspw. vor eine Porno-Seite zu setzen um es von Menschen lösen zu lassen


                    Über kurz oder lang wird dei Lösung wohl darauf hinauslaufen, dass die meisten Dinge einen Login erfordern werden (z.B. über OpenID). Und die Identität muss dann eben irgendwie bestätigt sein (z.B. über PostIdent oder führende SocialNetworks wie Facebook bieten APIs dazu an die Echtheit einer Person zu bestätigen...)

                    Aber das ist alles Zukunftsmusik und bis dahin: verwende was bei dir funktioniert.
                    [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

                    Kommentar


                    • #11
                      Bei Postings kann man doch einfach einen Spamfilter nutzen, anstatt CAPTCHAS.

                      Kommentar


                      • #12
                        Ein Captcha ist ein Spamfilter Oder welche Art von Spamfilter meinst du?
                        "[URL="http://www.youtube.com/watch?v=yMAa_t9k2VA&feature=youtu.be&t=25s"]Mein Name ist Lohse, ich kaufe hier ein.[/URL]"

                        Kommentar


                        • #13
                          Ich denke Badword-Filter, Linkfilter etc.
                          Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                          Kommentar


                          • #14
                            Man kann ja auch sage ich mal zusätzlich eine Wortfindung in ein Array speichern und als Abgleich auf Textfelder diese aus dem Array auslesen und wenn es eine Übereinstimmung gibt dann eben das Formular nicht abschickt!

                            Oder ist auch nicht so das wahre!

                            Ein Captcha als Gleichung zu schreiben ist auf alle Fälle besser weil da nicht der Text des Bildes eingetragen wird sondern das Ergebnis der Gleichung was keine sieht!
                            Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                            [URL]http://www.lit-web.de[/URL]

                            Kommentar


                            • #15
                              Und dafür noch einen Schritt weiter weg von der Barrierefreiheit.
                              Außerdem sehe ich jetzt keinen Unterscheid zwischen einem Badword-Filter und der von dir vorgeschlagenen Methode (abgesehen von der Forumlierung)...
                              Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

                              Kommentar

                              Lädt...
                              X