Anzeige eines Bildes mit PHP

Hi,

ob es gerechtfertig ist kann ich nur mit dem Argument der Unmengen von Spam beantworten.
Ziel meiner Anstrengung sollte auf jeden Fall sein, das Spam aufkommen in meinem GB zu minimieren, bzw. zu verbannen.

Dazu ist mir jedes Mittel und Aufwand Recht.

Als Spamabwehr bastle ich mir jetzt eine Rechenaufgabe aus zwei Bildern die eingegeben werden muss ?!

Danke für die Tipps

Gruß Matze
 
Hallo,

ich habe folgenden Code der mir ein Gif erstellt:
PHP:
header("Content-Type: image/gif");

$in = imagecreatefromgif("../spielwiese/images/banner_edit2.gif");
$in2 = imagecreatefromgif("../spielwiese/images/banner_edit2.gif");
$bgColor = ImageColorAllocate($in, 255, 255, 255);
imagecolortransparent($in, $bgColor);
imagecolortransparent($in2, $bgColor);
imagecopymerge($in, $in2, 0, 0, 0, 0, 40, 40, 90);

imagepng($in);
in der Datei wert.php.

Diesen Code binde ich über
Code:
include('../spielwiese/wert.php');
in meine index.php ein. Leider zeigt der Browser danach nur kryptische Schriftzeichen ein, wenn ic mir die gesamte Datei anschaue.

Das liegt vermutlich an:
PHP:
 header("Content-Type: image/gif");
in der wert.php.

Wie kann ich den Mix aus html und image/gif in einer Datei unterbringen und zu einer sauberen Anzeige bringen?


Vielen Dank und Gruß
Matze
 
Zuletzt bearbeitet:
Hi,

binde die Datei nicht über include ein, sondern als src eines img-Tags.

HTML:
<img src="../spielwiese/wert.php">

Wenn Du das Bild nicht dynamisch generieren würdest, würdest Du ja auch nicht einfach irgendwo den Binärcode ins HTML-Dokument klatschen, oder? ;)

LG
 
Hi,


danke für den Hinweis, es stimmt natürlich, ich sollte die Datei als image einbinden. Danke.

Jetzt habe ich noch ein Problem, ich möchte die Eingabe des Benutzers mit dem String auf dem Bild vergleichen. Dazu speichere ich den String in der bild.php Datei in einer SESSION.
PHP:
for ($i = 0; $i < count($string); $i++) {
$r_string .= $string[$i];
}
$_SESSION['r_string'] = $r_string;

Wenn ich aber per echo die Variable $_SESSION['r_string'] ausgeben will, zeigt er mir immer einen String hinterher an. D.h. Ich bin im Captcha auf sagen wir dm1872 und in der Session 6cjvp1.

An was kann das liegen?

Datei index.php
PHP:
$time = date("Y-m-j H:i:s");
echo '<img src="../spielwiese/bild.php" alt="Captcha">';
echo $_SESSION['r_string'];

Datei bild.php:
PHP:
    session_start(); 

// dbconnect.php
include('dbconnect.php');

$time = date("Y-m-j H:i:s");

$letters = range('a','z');
$numbers = range(1,26);
$string = "";

for ($i = strlen($string); $i < 6; $i++) {
$rand = mt_rand(0,25);
$string[] = $letters[$rand];
unset($rand);
}

for ($i = strlen($string); $i < 12; $i++) {
$rand = mt_rand(0,25);
$string[] = $numbers[$rand];
unset($rand);
}


shuffle($string);


for ($i = 0; $i < count($string); $i++) {
$r_string .= $string[$i];
}
$r_string = substr($r_string,0,6); 

$_SESSION['r_string'] = $r_string; 




// in die Datenbank eintragen 
$sql = "INSERT INTO captcha (sign, time)";
$sql .= "values ('{$_SESSION['r_string']}','{$time}');";
// echo $sql; Testausgabe
$result = mysql_query($sql);



$font = mt_rand(1,5);

$necwidth = (strlen($r_string)*imagefontwidth($font)) + 10;
$necheight = imagefontheight($font) + 10;

if ($necwidth < 140) { $necwidth = 140; }
if ($nechright < 40) { $necheight = 40; }

$image = imagecreate($necwidth, $necheight); 


$black = imagecolorallocate($image, 0, 0, 0);
$yellow = imagecolorallocate($image, 255,255,0);
$red = imagecolorallocate($image, 255,0,0);
$white = imagecolorallocate($image, 255,255,255);
$green = imagecolorallocate($image, 7, 255, 20);
$blue = imagecolorallocate($image, 12, 0, 255); 

imagefill($image,0,0,$black); // Füllen mit $black vom Punkt 0|0 aus, Start in der oberen linken Ecke
imagerectangle($image,10,10,130,20,$yellow); // Rechteck vom Punkt 10|10 aus bis zum Punkt 130|20, füllen mit $yellow
imagerectangle($image, 40,0,60,40, $blue);
imageline($image, 10,0,10,40,$red); // Linie vom Punkt 10|0 zum Punkt 10|40 in $rot
imageline($image,0,20,140,20,$green);
imageline($image,0,$necheight,$necwidth,0,$blue); 



imagestring($image,$font,12,12,$r_string,$white); 

header("content-type: image/gif");

imagegif($image);
imagedestroy($image);


Ich versteh das nicht, ich generiere doch in der bild.php den aktuellen String den ich einmal im Captcha verwende und gleichzeitig in eine SESSION speichere und ausgebe?!


Vielen Dank und Gruß Matze
 
Hi,

na ja, ist doch eigentlich logisch. bild.php wird doch erst ausgeführt, wenn index.php längst durch ist...

Pack einfach das ganze Berechnen und Setzen des Strings in die index.php oder in einen include und verwende in der bild.php nur die Session-Variable.

LG
 
Hi,

ich mache die Berechnung jetzt in der index.php.
PHP:
<?php
$letters = range('a','z');
$numbers = range(1,26);
$string = "";

for ($i = strlen($string); $i < 6; $i++) {
$rand = mt_rand(0,25);
$string[] = $letters[$rand];
unset($rand);
}

for ($i = strlen($string); $i < 12; $i++) {
$rand = mt_rand(0,25);
$string[] = $numbers[$rand];
unset($rand);
}


shuffle($string);


for ($i = 0; $i < count($string); $i++) {
$r_string .= $string[$i];
}
$r_string = substr($r_string,0,6); 

$_SESSION['r_string'] = $r_string;


$time = date("Y-m-j H:i:s");
echo $_SESSION['r_string'];
echo '<img src="../spielwiese/bild.php?strg='.$r_string.'" alt="Captcha">';

?>

dann übergebe ich die variable per $_GET an die bild.php

PHP:
<?php
session_start(); 

// dbconnect.php
include('dbconnect.php');

$time = date("Y-m-j H:i:s");

$string = $_GET['strg'];



// in die Datenbank eintragen 
$sql = "INSERT INTO captcha (sign, time)";
$sql .= "values ('{$_SESSION['r_string']}','{$time}');";
// echo $sql; Testausgabe
$result = mysql_query($sql);



$font = mt_rand(1,5);

$necwidth = (strlen($string)*imagefontwidth($font)) + 10;
$necheight = imagefontheight($font) + 10;

if ($necwidth < 140) { $necwidth = 140; }
if ($nechright < 40) { $necheight = 40; }

$image = imagecreate($necwidth, $necheight); 


$black = imagecolorallocate($image, 0, 0, 0);
$yellow = imagecolorallocate($image, 255,255,0);
$red = imagecolorallocate($image, 255,0,0);
$white = imagecolorallocate($image, 255,255,255);
$green = imagecolorallocate($image, 7, 255, 20);
$blue = imagecolorallocate($image, 12, 0, 255); 

imagefill($image,0,0,$black); // Füllen mit $black vom Punkt 0|0 aus, Start in der oberen linken Ecke
imagerectangle($image,10,10,130,20,$yellow); // Rechteck vom Punkt 10|10 aus bis zum Punkt 130|20, füllen mit $yellow
imagerectangle($image, 40,0,60,40, $blue);
imageline($image, 10,0,10,40,$red); // Linie vom Punkt 10|0 zum Punkt 10|40 in $rot
imageline($image,0,20,140,20,$green);
imageline($image,0,$necheight,$necwidth,0,$blue); 



imagestring($image,$font,12,12,$string,$white); 

header("content-type: image/gif");

imagegif($image);
imagedestroy($image); 

?>


Nach wie vor werden noch zwei verschiedene Strings angezeigt. Ich habe keine Ahnung wieso?! Als Ziel brauche ich aber beide Strings, einen im Bild und einen zweiten in einer Variablen um die Eingabe des Benutzers zu kontrollieren.

Matze
 
Zuletzt bearbeitet:
Hi,

warum übergibst Du den per GET? Du hast ihn doch in der Session und trägst den auch aus der Session in die Datenbank ein (wozu brauchst Du das eigentlich?). Eigentlich müsste das dann funktionieren. Was wird denn in die DB eingetragen?

LG
 
Hi,

ich hab das Gefühl dass er in der bild.php überhaupt nichts macht, außer den String zu liefern. Er macht kein echo und keinen Eintrag in die Datenbank.

PHP:
<?php
session_start(); 

// dbconnect.php
include('dbconnect.php');

$time = date("Y-m-j H:i:s");

$font = mt_rand(1,5);

$necwidth = (strlen($string)*imagefontwidth($font)) + 10;
$necheight = imagefontheight($font) + 10;

if ($necwidth < 140) { $necwidth = 140; }
if ($nechright < 40) { $necheight = 40; }

$image = imagecreate($necwidth, $necheight); 


$black = imagecolorallocate($image, 0, 0, 0);
$yellow = imagecolorallocate($image, 255,255,0);
$red = imagecolorallocate($image, 255,0,0);
$white = imagecolorallocate($image, 255,255,255);
$green = imagecolorallocate($image, 7, 255, 20);
$blue = imagecolorallocate($image, 12, 0, 255); 

imagefill($image,0,0,$black); // Füllen mit $black vom Punkt 0|0 aus, Start in der oberen linken Ecke
imagerectangle($image,10,10,130,20,$yellow); // Rechteck vom Punkt 10|10 aus bis zum Punkt 130|20, füllen mit $yellow
imagerectangle($image, 40,0,60,40, $blue);
imageline($image, 10,0,10,40,$red); // Linie vom Punkt 10|0 zum Punkt 10|40 in $rot
imageline($image,0,20,140,20,$green);
imageline($image,0,$necheight,$necwidth,0,$blue); 



// in die Datenbank eintragen 
$sql = "INSERT INTO captcha (sign, time) values ('{$_SESSION['r_string']}','{$time}');";
// echo $sql; Testausgabe
$result = mysql_query($sql);


imagestring($image,$font,12,12,$string,$white); 

header("content-type: image/gif");

imagegif($image);
imagedestroy($image); 

?>

Ich habe keine Ahnung an was das liegen könnte?!


Gruß Matze
 
Hi,

in der bild.php kannst Du keine Testausgaben per echo machen. Du kannst höchstens Einträge in eine Log-Datei schreiben.
In der jetztigen Version vermisse ich die Definition von $string. Was gibt bild.php den momentan aus? Ändert sich der String überhaupt noch (Cache)?

LG
 
Zurück