CAPTCHA Problem

walle_89

Mitglied
Hallo liebe PHP-Gemeinde! ;)

Ich habe ein wieder mal ein ganz banales Problem, was ich nicht so schnell lösen kann - leider.
Es geht um das folgende Tutorial.
Ich habe das dann auch meinem Server hochgeladen, doch es will nicht funktionieren. Ich habe NICHT die GD-Lib vergessen, wie man anhand von phpInfo sehen kann. Ich kann mir aber nicht vorstellen, woran es noch liegen könnte.
Ich habe dennoch eine Zeile verändert
// Liste aller verwendeten Fonts
$FONTS[] = 'XFILESf';

Danke schonmal im Voraus, walle_89
 
Kannst du mal die Datei als Source zur Verfügung stellen? Also z.b. in captcha.phps umbenennen, so das man evtl. die Möglichkeit der Fehler-Analyse hat?

Grüße
 
Wie ich schon sagte, habe ich nur eine Zeile verändert.

captcha.php
PHP:
<?php

    $CAPTCHA_LENGTH = 5;    // Länge der Captcha-Zeichenfolge, hier fünf Zeichen
    $FONT_SIZE      = 18;   // Schriftgröße der Zeichen in Punkt
    $IMG_WIDTH      = 170;  // Breite des Bild-Captchas in Pixel
    $IMG_HEIGHT     = 60;   // Höhe des Bild-Captchas in Pixel

    // Liste aller verwendeten Fonts
    $FONTS[] = 'XFILESf';

    // Unser Zeichenalphabet
    $ALPHABET = array('A', 'B', 'C', 'D', 'E', 'F', 'G',
                      'H', 'Q', 'J', 'K', 'L', 'M', 'N',
                      'P', 'R', 'S', 'T', 'U', 'V', 'Y',
                      'W', '2', '3', '4', '5', '6', '7');

    // Wir teilen dem Browser mit, dass er es hier mit einem JPEG-Bild zu tun hat.
    header('Content-Type: image/jpeg', true);

    // Wir erzeugen ein leeres JPEG-Bild von der Breite IMG_WIDTH und Höhe IMG_HEIGHT
    $img = imagecreatetruecolor($IMG_WIDTH, $IMG_HEIGHT);

    // Wir definieren eine Farbe mit Zufallszahlen
    // Die Farbwerte sind durchgehend und absichtlich hoch (200 - 256) gewählt,
    // um eine "leichte" Farbe zu erhalten
    $col = imagecolorallocate($img, rand(200, 255), rand(200, 255), rand(200, 255));

    // Wir füllen das komplette Bild mit der zuvor definierten Farbe
    imagefill($img, 0, 0, $col);

    $captcha = ''; // Enthält später den Captcha-Code als String
    $x = 10; // x-Koordinate des ersten Zeichens, 10 px vom linken Rand


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

        $chr = $ALPHABET[rand(0, count($ALPHABET) - 1)]; // ein zufälliges Zeichen aus dem definierten Alphabet ermitteln
        $captcha .= $chr; // Der Zeichenfolge $captcha das ermittelte Zeichen anfügen

        $col = imagecolorallocate($img, rand(0, 199), rand(0, 199), rand(0, 199)); // einen zufälligen Farbwert definieren
        $font = $FONTS[rand(0, count($FONTS) - 1)]; // einen zufälligen Font aus der Fontliste FONTS auswählen

        $y = 25 + rand(0, 20); // die y-Koordinate mit einem Mindestabstand plus einem zufälligen Wert festlegen
        $angle = rand(0, 30); // ein zufälliger Winkel zwischen 0 und 30 Grad

        /*
         * Diese Funktion zeichnet die Zeichenkette mit den
         * gegeben Parametern (Schriftgröße, Winkel, Farbe, TTF-Font, usw.)
         * in das Bild.
         */
        imagettftext($img, $FONT_SIZE, $angle, $x, $y, $col, $font, $chr);

        $dim = imagettfbbox($FONT_SIZE, $angle, $font, $chr); // ermittelt den Platzverbrauch des Zeichens
        $x += $dim[4] + abs($dim[6]) + 10; // Versucht aus den zuvor ermittelten Werten einen geeigneten Zeichenabstand zu ermitteln
    }

    imagejpeg($img); // Ausgabe des Bildes an den Browser
    imagedestroy($img); // Freigeben von Speicher
?>
 
Also bei mir funktioniert das alles, wenn ich eine Schriftart in den Script-Ordner kopiere und als Eintrag folgendes mache:

PHP:
$FONTS[] = 'Achafontf';
Wie ich sehe, fehlt bei dir die Datei-Endung. Entwickelst du unter Windows und hast vergessen, das in der Standard-Einstellung die Datei-Endung ausgeblendet wird? Wenn ja, dann schreib einfach mal ein f hinter den Dateinamen im Script.

Grüße

EDIT: Warum schneidet die Forum-Software etwas aus meinem Posting? Gemeint war die Dateiendung "t t f". Irgendwas seltsames geht hier vor.
 
Zuletzt bearbeitet:
Bei mir hatte die Forensoftware auch etwas abgeschnitten. Meine Fonts definierte ich folgendermaßen:

$FONTS[] = 'XFILES. t t f '; (ohne den Leerzeichen)

Also eigentlich richtig so, oder? Oder kann mir einer mal sagen, wie ich debuggen soll? Eine andere Schriftart?

(Das Script läuft unter Linux)
 
Pfadangabe und Dateiname passen auch von der Groß-/Kleinschreibung her? Linux-Dateisysteme legen einen Wert auf die korrekte Schreibweise. Hast du die Fonts evtl. auch in einem Unterordner abgelegt? Du kannst auch mal versuchen, den absoluten Pfad zur Datei anzugeben. Da die Forumsoftware das wegschneidet, kann leider nicht genau sagen, was hier falsch läuft. Bei mir funktioniert das Script jedenfalls, ich habe die Schrift-Datei in genau dem gleichen Verzeichnis wie das Script und verwende Windows. Daher ist die Groß-/Kleinschreibung bei mir egal.

EDIT: Achso. Linux: Passen die Zugriffsrechte? Darf dein Webserver (idR. Benutzer httpd, apache oder www) die Schriftdatei lesen?
 
Zuletzt bearbeitet:
Ich habe die Dateiendungen geprüft und auch sonstige Sachen (Pfad, etc.) getestet. Deine Vermutung wegen des Webservers könnte womöglich zutreffen ... Wie soll ich dem Apache sagen, dass er die Schriftdatei lesen darf? :)
 
Du kannst die Datei-Attribute mittels eines geeigneten FTP-Client oder lokal im Dateisystem mittels des Kommandos ls -l prüfen. Notfalls änderst du die Attribute mittels chmod so ab, das alle User die Datei zumindest mal lesen können:

chmod 0444 [pfad_zur_schriftdatei]

Oder dein FTP-Client kann das. Wenn du nicht weißt, ob und wie man das mit deinem FTP-Client machen kann, schreib mal, was du verwendest. Mit Filezilla geht das über das Kontext-Menü auf der entsprechenden Datei. Gebe am besten Allen (Eigentümer, Gruppe und Sonstige) Leserechte.

Grüße
 
Dann kann ich nur noch vermuten, das die Schrift-Datei kaputt ist. Versuch mal eine andere. Mehr Ideen habe ich leider auch nicht.
 
Zurück