Was sind das für Zeichen?

mkoeni1

Erfahrenes Mitglied
Hallo Leute ich habe eine Klasse für Captcha geschrieben und diese in ein Formular eingebettet um dort zu erscheinen, aber diese Klasse gibt mir nur wirre Zeichen zurück.
Code:
GIF87aF??€?????ÿÿÿ,????F???…„©Ëí£œ´Ú‹³Þ¼û†âH–晢*-ð±Jt ¯¶>áø®›ñ„9Öê“ÜnÆ—sÈ3.˜EJë b¥®(0è…lŸ2p²Ú¥ŽÃ5úy²Ýgq»<ê¹åé>W×vFö6ègÈæTWh¸ƒV$WÁHÆ·ôå‰Òéù	*:Q??;

Die Klasse sieht so aus:
PHP:
...
   <tr>
      <td  style="font-family: verdana,arial,helvetica; font-size : 75%; text-align: right;">Passwort wiederholen*</td>
      <td><input type="password" name="password2" value="" style="font-family: verdana,arial,helvetica; font-size : 75%; color:#800000;" onFocus='this.style.backgroundColor="#FFC"' onBlur="set()"></td>
      <td>&nbsp;</td>
    </tr>
    
<?php
// define 'ImageGenerator' class
class ImageGenerator{

 private $width=70;
 private $height=23;
 private $bgColor='0,0,0';
 private $textColor='255,255,255';
 private $inputString='Default Input String';
 private $bgImage=NULL;

// initialize input arguments

public function __construct($inputString='Default Input String'){

  if(strlen($inputString>255)){

   throw new Exception('Invalid length for input string.');

}

  $this->inputString=$inputString;

}

  public function setImageWidth($width=400){

   if(!is_int($width)&&$width>800){

    throw new Exception('Invalid width for image stream.');

}

  $this->width=$width;

}

  public function setImageHeight($height=300){

   if(!is_int($width)&&$height>600){

    throw new Exception('Invalid height for image stream.');

}

}

  public function setImageBgColor($bgColor='0,0,0'){

   if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$bgColor)){

    throw new Exception('Invalid format for background color.');

}

  $this->bgColor=$bgColor;

}

  public function setImageTextColor($textColor='255,255,255'){

   if(!preg_match("/^d{1,3},d{1,3},d{1,3}$/",$textColor)){

    throw new Exception('Invalid format for text color.');

}

  $this->textColor=$textColor;

}

  public function setBgImage($bgImage='images/default.gif'){

   if(!file_exists($bgImage)){

    throw new Exception('Invalid background image.');

}

  $this->bgImage=$bgImage;

}

  public function setImageFont($font){

   if(!file_exists($font)){

    throw new Exception('Invalid image font.');

}

  $this->font=$font;

}

// create image stream

  public function displayImageStream(){

$this->img=$this->bgImage!=NULL?imagecreatefromgif($this->bgImage):imagecreate($this->width,$this->height);

  $bgColor=explode(',',$this->bgColor);

  $textColor=explode(',',$this->textColor);

// allocate background color on image stream

imagecolorallocate($this->img,$bgColor[0],$bgColor[1],$bgColor
[2]);

// allocate text color on image stream

$textColor=imagecolorallocate($this->img,$textColor[0],$textColor
[1],$textColor[2]);

// load font

if(!imagestring($this->img,5,$this->width/2-strlen($this->inputString)*5,$this->height/2-5,$this->inputString,$textColor)){

  throw new Exception('Error creating image text');

}
 // header("Content-type: image/gif");

// display image
  imagegif($this->img);

// free up memory
  imagedestroy($this->img);

 }

}



class RandomGenerator{

  private $length;

  private $chars="ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";

  public function __construct($length=6){

   if(!is_int($length)||$length<1){

    throw new Exception('Invalid length for random string.');

}

  $this->length=$length;

}

  public function getRandomValue(){

   $rndstr='';

    $maxvalue=strlen($this->chars)-1;

   for($i=0;$i<$this->length;$i++){

    $rndstr.=substr($this->chars,rand(0,$maxvalue),1);

}

  return $rndstr;

 }

}
      try{

// create new instance of 'RandomGenerator' class
  $rnd=new RandomGenerator();

// create new instance of 'ImageGenerator' class
  $imgGen=new ImageGenerator($rnd->getRandomValue());
  
  echo '<tr><td>';
  //display image stream on the browser
  $imgGen->displayImageStream();
  echo '</td>';
}
catch(Exception $e){
  echo $e->getMessage();
  exit();
  } 
?> 
    
      <td><input type="text" name="kombi" value="" style="font-family: verdana,arial,helvetica; font-size : 75%; color:#800000;" onFocus='this.style.backgroundColor="#FFC"' onBlur="set()"></td>
       <td>&nbsp;</td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input type="submit" name="send" value="Register" style="background-color:goldenrod;color:black; border: solid 1px silver;cursor:hand; width: 44px; font-family: verdana,arial,helvetica; font-size : 75%;" onMouseOver="this.style.backgroundColor='#efefef';" onMouseOut="this.style.backgroundColor='goldenrod';">
      <input type="reset" value="Reset" onclick="window.location.reload()" style="background-color:goldenrod;color:black; border: solid 1px silver;cursor:hand; width: 35px; font-family: verdana,arial,helvetica; font-size : 75%;" onMouseOver="this.style.backgroundColor='#efefef';" onMouseOut="this.style.backgroundColor='goldenrod';"></td>
      <td>&nbsp;</td>
    </tr>
  </table>
<form>
...

Kann mir bitte jemand sagen was dort schief läuft? Hat dies was mit den Headern zu tun das der Brauser nicht anzeigt.


Vielen Dank und Gruß
Matze


Zusatz Info:
Mir ist klar, dass der Browser wissen muss was auf ihn zukommt. Durch das auskommentieren der Zeile:
PHP:
 // header("Content-type: image/gif");
hat er keinen Schimmer und er bringt diese Fehlermeldung da er mit gif so nichts anfangen kann. Das stimmt schon. Nur wo setzt er den Header?

Wenn ich die Zeile
PHP:
header("Content-type: image/gif");
einhänge meldet mir der Browser:
Code:
Warning: Cannot modify header information - headers already sent by (output started at /opt/lampp/htdocs/WebSeite/testing/index.php:12) in /opt/lampp/htdocs/WebSeite/testing/register.php on line 165
GIF87aF??€?????ÿÿÿ,????F???z„©Ëí£œ´Ú‹³Þ¼û†âH–æÉj€¬l»®š¾ó«Ñ†®¼ëÉ~à ±(¤%q¾X–wLeUúÌR£°ÞR›=~3Þ)Ø -o‹dóFÞXc öLÆ×P¼evwƦváÔÅÔ¤´ˆ˜ðã‚"9IYiy™Q??;

Kennt sich jemand damit aus und kann dieses Problem lösen:

Die obere Seite errecihe ich über den Link:
Code:
index.php?action=Register

Die index.php unterscheidet die Seiten:
PHP:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Titel</title>
<link rel="stylesheet" type="text/css" href="css/robo.css">
</head>
<body>
 <!-- Inhalt der Datei -->
<?php
// echo $_SESSION['login'];
//  Es wird &uuml;berpr&uuml;ft ob POST oder GET Variablen gesetzt sind und wenn ja neu zugeordnet
if (isset($_POST['action']))
	{	$action = $_POST['action'];	
	}
	else
	{	if (isset($_GET['action']))
			{	$action = $_GET['action'];	}
			else
			{	$action = "start" ;		}
	}

/*  Gesamter Inhalt  */
echo '<div style="width:1000px;height: 600px; margin:0px auto; text-align:left; border:dashed 1px #000000;">';

switch ($action){ 
    case Memberbereich:         
            include('memberbereich.php'); 
            break; 
    case Einstellungen: 
            include('einstellungen.php'); 
            break; 
    case Anleitung: 
            include('anleitung.php'); 
            break;
    case Hilfe:
            include('hilfe.php'); 
            break;  
    case Register: 
            include('register.php'); 
            break;
    case Uebersicht: 
            include('uebersicht.php'); 
            break; 
    case Logout: 
            include('logout.php'); 
            break;
    case Forget:
            include('forget.php');
            break; 
    default: 
            include('login.php'); 
}


echo '</div>';

echo '<div id="footer"><a href="#">Impressum</a></div>';

?>

</body>
</html>
 
Zuletzt bearbeitet:
Des Problems Lösung steht ja schon fast in der Fehlermeldung:
Code:
Warning: Cannot modify header information - headers already sent by (output started at /opt/lampp/htdocs/WebSeite/testing/index.php:12) in /opt/lampp/htdocs/WebSeite/testing/register.php on line 165
Die Funktion header() muss ganz am Anfang vor allen anderen Ausgaben wie echo oder print() stehen.
http://de.php.net/header
 
Hi,

verstehe ich das so richtig. Wenn ich die register.php über das switch case auf der index.php erreiche habe ich immer den Header den ich in index.php:
Code:
header('Content-type: text/html');
definiert habe, bzw. standardmäßig geladen wird
Es gibt jedesmal einen Konflikt zwischen index.php und register.php. Wie kann ich diese zwei Seiten mit unterschiedlichen Browserinformationen:
Code:
header('Content-type: text/html');
Code:
header('Content-type: image/gif');
trennen?

Gruß
Matze
 
Du kannst kein HTML und GIF gleichzeitig ausgeben, da beides separate Medientypen sind. Entweder bindest du sie über die üblichen HTML-Mittel ein oder bettest sie direkt mittels data-URI-Schema ein.
 
Die üblichen HTML-Mittel sind das img- oder object-Element, bei dem eine externe Ressource angegeben werden muss.
Oder die Grafik wird direkt mittels data-URI-Schema eingebettet:
PHP:
ob_start();
imagegif($this->img);
$content = ob_get_clean();
echo '<img src="data:image/gif;base64,'.base64_encode($content).'">';
Letzteres ist aber von der Unterstützung dieses URI-Schemas abhängig.
 
Hallo,

ich habe es jetzt erfolgreich mit den "HTML-Mitteln" reralisiert, da ich für data-URI-Schema keine Browserweiche habe.
Was sich mir aber noch für eine Frage stellt, ich muss dieses Bild (img src) ja überprüfen ob es korrekt in meinem Formular eingegeben wurde. Ist dies möglich mit einem kl. Umweg in dem ich es erst in eine Datenbank eintrage?


Vielen Dank und Gruß
Matze
 
Wenn du das Captcha Image generierst, generierst du ja direkt auch die Lösung. Diese musst du natürlich irgendwo speichern damit du evaluieren kannst ob die Daten vom User gültig sind. Du kannst dies natürlich in eine Datenbank schreiben wenn du möchtest (oder in ein File oder wo auch immer :)). Ich würde noch einen Timestamp dazu abspeichern. Wenn die Lösung älter als X Sekunden ist würde ich die Lösung aus der Datenbank (oder wo du sie auch immer abspeicherst) löschen. Ich hoffe das hilft :)

MFG
X
 
Ja stimmt, ich realisiere es so:
Ich speichere die Lösung in der Datenbank und ware bis der Button "Register" gedrückt wurde. Dann vergleiche ich das Captchaa mit der letzten Lösung in der DB. Ist dies der Fall erfolgt eine erfolgreiche Registrierung! Ist das nicht der Fal wird die Registrierung abgelehnt.

Was mich noch ein bisschen nervt ist, was ist wenn sich 2 User unmittelbar gleichzeitig versuchen zu registrieren? Dann kann unter Umständen User A das captcha von User B bekommen, je nachdem wer schneller ist und dann?

Mhhmm was nun?

Vielen Dank und Gruß
Matze
 
Zurück