PHP weiter Code nach header()

Maik1

Grünschnabel
Hallo,

ich bin leider ein absoluter Neuling in sachen php. Ich habe mich mit der erestellung eines Captchas beschäftigt und als erstes die Grafik erstellt. Dies Funktioniert auch alles soweit so gut mit dem folgenden Code:
PHP:
<?php

session_start();

// alle moeglichen Zeichen
$moegliche_zeichen
   = "A B C D E F G H J K M N Q R T U V W X Y 2 3 4 5 7 8";

// erstellen eines Arrays
$kombinationen = explode(" ", $moegliche_zeichen);

// mischen des Arrays
shuffle ( $kombinationen );

// die ersten 6 Zeichen aus dem gemischten Array
$text = array_slice($kombinationen, 0, 5);

// Speicherung in SESSION-Variable für spätere Auswertung
$SESSION['captcha-wert'] = $text;

Header ("Content-type: image/png");
$bild = imagecreatefrompng ("neu.png");


// Farben definieren
$farbe_w = ImageColorAllocate ($bild, 255, 255, 255);
$farbe_b = ImageColorAllocate ($bild, 0, 0, 0);



imagettftext ($bild, 32, 0, 10,  70, $farbe_b, "arial.ttf",
              $text[0]);
imagettftext  ($bild, 32, 0, 40, 70, $farbe_b, "arial.ttf",
              $text[1]);
imagettftext ($bild, 32,   0, 70, 70, $farbe_b, "arial.ttf",
              $text[2]);
imagettftext  ($bild, 32,  0,  100, 70, $farbe_b, "arial.ttf",
              $text[3]);
imagettftext  ($bild, 32,  0,  130, 70, $farbe_b, "arial.ttf",
              $text[4]);

// Ausgabe im Format PNG
imagepng($bild);

// Ressourcen wieder freigeben
imagedestroy($bild);


Nun wollte ich danach mit der gespeicherten $SESSION['captcha-wert'] weiterarbeiten, nur wird mir nachdem ich header(); verwende der komplette Code ignoriert.

Ich habe bereits versucht mit header_remove("Content-type"); den header wieder zu entfernen nachdem das Bild erstellt wurde, jedoch ohne Erfolg.

Vielleicht könntet ihr mir helfen.
 
Zuletzt bearbeitet von einem Moderator:
Das oben gezeigte Skript erstellt ein Bild und zeigt dieses an.
Die Überprüfung, ob eingegebener Code mit dem in der SESSION übereinstimmen, erfolgt typischerweise an anderer Stelle - nämlich in dem Skript, in dem auch das Form Handling (also POST Daten verarbeiten, validieren, speichern ...) gemacht wird. Dort kannst du dann auch etwas einbauen wie
PHP:
if($_SESSION['captcha-code'] === $_POST['captcha-code']) { //... }
 
Ich versteh. Sprich die SESSION Variable per Post übergeben und in der index Verarbeiten. Danke :)
 
Das mit der Übergabe zur Überprüfung habe ich verstanden, nur will ich nun das Captcha erstellen lassen. Dazu habe ich in der html:

<img src="Bild.php" title="CaptchaBild"/>

eingefügt. Jedoch wird mir nur ein Platzhalter statt des Bildes angezeigt. Der Pfad ist jedoch richtig, denn wenn ich die PHP direkt ausführe funktioniert es.

Wie kann ich mein Bild in die HTML einfügen/aufrufen ?
 
Ich versteh. Sprich die SESSION Variable per Post übergeben und in der index Verarbeiten. Danke :)
Öhm, nein? Warum interne Session-Daten nach extern an ein anders Script weitergeben?

[...]
<img src="Bild.php" title="CaptchaBild"/>
[...]Jedoch wird mir nur ein Platzhalter statt des Bildes angezeigt. Der Pfad ist jedoch richtig, denn wenn ich die PHP direkt ausführe funktioniert es.

Gross- / Kleinschreibung beachtet? Heisst die Date wirklich "Bild.php" und nicht "bild.PHP"?

Grüsse,
BK
 
Bild.php ist schon richtig. Klappt ja wie gesagt auch, wenn ich die php direkt aufrufe. Die Idee mit dem Post vergess ich mal ganz schnell wieder :confused:.
 
Hi,

du kannst auf den Platzhalter einen Rechtsklick -> Bild anzeigen wählen. Dann ändert sich die URL im Browser auf das Bild direkt.
Eventuell stimmt der Pfad nicht oder eine andere Fehlermeldung wird angezeigt?

Grüsse,
BK
 
@Maik1 Nein, aus dem POST kommt später den Code, den der User eingeben muss, in der SESSION steht der, der auf dem Bild zu sehen war. Logischerweise sollten für einen effektiven Schutz beide übereinstimmen.
 
Ok, nach ein, zwei Stunden rumprobieren und letztendlich Neuanlegung des Projektes wird das Bild nun angezeigt, obwohl exakt der gleich Code verwendet wird.
@alxy Das mit mit POST war mir bewusst, kam nur nicht ganz so rüber sry. Doch wie trenne ich jetzt die Überprüfung, welche du ja schon erwähnt hattst : if($_SESSION['captcha-code'] === $_POST['captcha-code']) { //... } mit dem Erstellungsscript des Bildes, ohne dass ich aus der SESSION etwas herausgebe (wie Bratkartoffel es erwähnte) ?

Ich habe in der HTML ein simples Formular zur Eingabe erstellt. Wo schreibe ich jetzt meine Funktion zur Überprüfung ?

Und ein großes Dankeschön, dass ihr beide so schnell und gut Antwortet. Auch dass ihr euch um solche Neulinge wie mich euch kümmert ist nicht selbstverständlich :)

Gruss Maik
 
Hoi Maik1,

vom Prinzip her ist so ein Captcha immer dreitilig.
1. Das Formular anzeigen (z.b. login.php)
2. Ein Bild erzeugen und in 1 anzeigen (get_captcha.php)
3. Die Formulareingaben auswerten (z.b. take_login.php)

Der Punkt 1 steht für das einfache Formular, welches du schützen willst. Hier kommen die <input> Felder rein und eben auch ein Bild (<img>) welches auf die get_captcha.php (2) verweist.
Wird das Bild erzeugt, so wird zuerst auf dem Server eine Session gestartet. Das Bild wird generiert und an den Browser ausgegeben, die Zeichenfolge wird allerdings in der Session auf dem Server gespeichert. Der Benutzer darf ja nicht wissen, was raus kommt, sonst wäre das Captcha ja überflüssig.
Im Punkt 3 verarbeitest du deine Formulardaten: Im obigen Beispiel also Benutzername und Passwort prüfen sowie die übermittelte Captcha-Antwort des Benutzers mit der erwarteten Antwort aus der Session vergleichen.

Das ganze Session-System ist extrem nützlich, da du hier Daten ablegen kannst, die der Benutzer weder direkt sehen, noch bearbeiten kann. Beim Starten der Session wird dem Browser ein Cookie gegeben mit einer Zeichenfolge die ihn eindeutig identifiziert (Session Hash). Dieser sendet der Browser bei jeder Anfrage mit. Somit sieht der Server den Hash und weiss genau welche Daten dem einen Benutzer zugeordnet sind.

Hoffe die Beschreibung macht den Ablauf und die Logik dahinter etwas klarer für dich.

Grüsse,
BK
 
Zurück