MyBB.de Forum

Normale Version: Captcha vereinfachen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Wo kann ich die Ausnahmen für Captchas definieren?

Z.B. dass die Eingabe "0" auch akzeptiert wird, wenn der Captcha ein "O" angezeigt hat.

0 = O = o
Z = z
1 = l = I
C = c
K = k
P = p
S = s
U = u = v = V
W = w
X = x
Y = y
Z = z

Das sollte die am häufigsten verwechselten sein.
Ich dachte es gäbe vielleicht schon einige Ausnahmen, die ich nur ergänzen müsste. Bei Rapidshare ist das z.B. ja genauso.
Hier hat en-gedi einen Lösungs vorschlag.
https://www.mybb.de/forum/showthread.php?tid=600
Danke, den Thread kannte ich aber schon (image.php scheint jetzt captcha.php zu heißen). Nichtsdestotrotz ist es aber auch mit einem völlig neutralen Hintergrund unmöglich zwischen "0" und "O" in einm Captcha zu unterscheiden. ATM muss man so lange registrieren drücken, bis keiner der genannten Buchstaben vorkommt. Wenn doch hat man je nach Buchstabe schelchtenfalls eine Chance von 1:3, d.h. von 4 Leuten kann sich nur einer registrieren. Wenn gleich 2 von diesen Buchstaben vorkommen kann man es gleich ganz vergessen Sad.
Nur so ein Denkansatz, also bitte nicht lachen Wink

Man könnte doch versuchen, in den Weiten des WWW eine frei verfügbare Schriftart zu finden, die entweder nur Zahlen oder nur Buchstaben enthält (keine Ahnung, ob´s sowas überhaupt gibt) und die dann als einzige TTF-Datei im Ordner "/inc/captcha_fonts" speichern.

Das würde die Fehlerquote wieder um einiges reduzieren.
Der Inhalt des Captchas wird über die Funktion random_str() in der Datei inc/functions.php generiert. In der Funktion kannst du die entsprechenden Zeichen aus dem Array entfernen.
Wenn ich die Buchstaben (28 sind ja nicht wenige) in der random_str() lösche, beeinflusse ich damit nicht auch alle anderen Dateien, die das vielleicht brauchen. Z.B. die Sessions?

Ich kenne mich mit PHP leider nicht so aus, habe aber in der member.php diese Funktion gefunden:
Code:
if($mybb->settings['captchaimage'] == "on" && function_exists("imagecreatefrompng"))
    {
        $imagehash = $db->escape_string($mybb->input['imagehash']);
        $imagestring = $db->escape_string($mybb->input['imagestring']);
        $query = $db->simple_select(TABLE_PREFIX."captcha", "*", "imagehash='$imagehash' AND imagestring='$imagestring'");
        $imgcheck = $db->fetch_array($query);
        if(!$imgcheck['dateline'])
        {
            $errors[]  = $lang->error_regimageinvalid;
        }
        $db->delete_query(TABLE_PREFIX."captcha", "imagehash='$imagehash'");
    }

Wenn ich das richtig sehen ist "$imgcheck = $db->fetch_array($query);" doch der Part, wo das Image mit der Benutzereingabe abgeglichen wird, oder? In JS würde ich jetzt einfach eine Schleife machen, die jede Eingabe einzeln überprüft. Ungefähr so:

Code:
for (var i=0; i<komischerPHPArrayUsereingabe.length; i++){
    switch (komischerPHPArrayUsereingabe[i]){
             case komischerPHPArrayDBImage[i]: break; //Wunderbar Eingabe und Bild stimmen bei diesem Zeichen überein
             case "x": if (komischerPHPArrayDBImage[i]=="X"){
                              //nächstes Zeichen/Schleifendurchlauf
                                 break;
                           }
                 default: return false; //Zeichen stimmt nicht überein; Test fehlgeschlagen
         }
}
Das ginge natürlich auch. Allerdings sollte das Forum auch weiterhin fehlerfrei arbeiten wenn du die Zeichen aus dem Array löschst.