Captcha Probleme

DieAstra

Grünschnabel
Hallo zusammen, ich bin neu hier und habe natürlich schon eine Frage! :-(

Also:
Ich möchte mein Gästebuch mit einer Captchaeinbindung absichern.
GB ist mit anhängiger Datenbank erstellt (alles mit Dreamweaver).

PHP:
<form name="" action="<?php echo $_SERVER['PHP_SELF']; ?>" 
 method="POST" enctype="text/html">
<p><span class="bold">Ihr Name:</span><br />
<input type="text" name="name" value="" size="50" maxlength="150" />
</p>

<p><span class="bold">Ihre E-Mail-Adresse:</span><br />

<input type="text" name="email" value="" size="50" maxlength="150" />

</p>

<p><span class="bold">G&auml;stebucheintrag:</span><br />
<textarea name="eintrag" rows="10" cols="50"></textarea>
</p> 



<input type="Submit" name="" value="speichern" /> 
</form> 
<p class="bold">
  <?php 
  array_walk ( $_POST,    'eingabebereinigen' );
array_walk ( $_GET,     'eingabebereinigen' );
array_walk ( $_REQUEST, 'eingabebereinigen' );

function eingabebereinigen(&$value, $key)
{

  $value = strip_tags($value, '<p><br /><b><strong>'); 

  $value = htmlspecialchars($value, ENT_QUOTES);

 
  $value = trim($value);
}

if ( $_POST['name'] != "" ) 
if ( $_POST['eintrag'] != "" ) 

$sql = " INSERT INTO gaestebuch ";
$sql .= " SET ";
$sql .= " name   ='". $_POST['name'] ."', ";
$sql .= " email  ='". $_POST['email'] ."', ";
$sql .= " datum  ='". date("Y-m-d H:i:s") ."', ";
$sql .= " eintrag='". $_POST['eintrag'] ."' ";


?>
  <?php
require_once ('konfiguration.php'); 
$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_link )
{
   
}
$db_sel = mysql_select_db( MYSQL_DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen"); 
	
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
echo  '<p><span class="bold">Bitte füllen Sie das Formular vollst&aumlndig aus</span></p>'; 
} 
else
echo '<p class="bold"><a href="gaestebuch.php">G&auml;stebuch anzeigen</a></p>';
exit; 

	?>

Nun möchte ich dieses Captcha einbinden. Habe mir natürlich Billies Programm vorgenommen und getestet. Seine Schriften habe ich durch meine im Rootverzeichnis vorhandene Schriften ersetzt.
Ich bekomme NUR Hyroglyphen als Ergebnis.

Nun meine Frage: Wo könnte die Ursache liegen?

Ich hoffe, da ist jemand, der mir weiterhelfen kann! Vorab schon einmal DANKE!

LG Astra
 
Ups, sorry! Ich dachte, es liegt grundsätzlich an meinem Code. Hier also das abgeänderte Skript von Billie:

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[] = './ttf/arial.\ttf'; 
    $FONTS[] = './ttf/actionj.\ttf'; 
    $FONTS[] = './ttf/acidd.\ttf'; 

    // 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 
?>

bis auf die Schriften "arial und acidd" habe ich nichts verändert. wenn ich das nun im Browser anschaue bekomme ich Folgendes:


????JFIF??>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ??C    $.' ",#(7),01444'9=82<.342??C  2!!22222222222222222222222222222222222222222222222222??<?"?? ???}AQa"q2???#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????? ???wAQaq"2?B???? #3R?br? $4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?????????????????????????????????????????????????????????????????????????? ??(???0??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??


Reicht das für eine Fehlernalyse?

Danke nochmals!

LG Astra
 
Ich würde erstmal error_reporting auf E_ALL setzen. Zudem finde ich dieses Programm nicht sehr gelungen. Ich würde es mit einer Captcha-Klasse versuchen. Zudem finde ich nirgendwo in deinem Code die Stelle, wo das Captcha eingebunden wurde. Hast du die captcha.php mal ohne das drum herum aufgerufen?
MfG, Andy
 
Ok, ich habe nun ErrorReporting erhalten:

Warning: Cannot modify header information - headers already sent by (output started at /homepages/...../htdocs/captcha.php :9) in /homepages/...../htdocs/captcha.php on line 29

Zeile 29: header('Content-Type: image/jpeg', true);


Warning: imagettftext() [function.imagettftext]: Could not find/open font in /homepages/...../htdocs/captcha.php on line 62

Zeile 62: imagettftext($img, $FONT_SIZE, $angle, $x, $y, $col, $font, $chr);

Warning: imagettfbbox() [function.imagettfbbox]: Could not find/open font in /homepages/...../htdocs/captcha.php on line 64

Zeile 64: $dim = imagettfbbox($FONT_SIZE, $angle, $font, $chr);

_____________________________________________

Das gab es dabei!

Ich habe eine Capthcha.php nur mit dem abgeänderten Code von Billie erstellt und getestet. In mein Script eingebaut habe ich sie noch nicht.
Ich glaube, ich habe einen grundsätzlichen Denkfehler bei der Funktionsweise des Captchas.
Tut mir leid, aber im Moment stehe ich wirklich brutal auf der Leitung. :(

PS: auch wenn ich das nun nicht hinbekomme, ich möchte es gerne verstehen!
LG Astra
 
Etwas anderes: Deine eingabebereinigen()-Funktion eignet sich nicht als Schutz vor SQL-Injektionen. Verwende dafür die mysql_real_escape_string()-Funktion.
 
Hi Markus,
also, denn schau doch bitte mal!

PHP:
<?php 
mysql_real_escape_string ( $_POST,    'eingabebereinigen' );
mysql_real_escape_string ( $_GET,     'eingabebereinigen' );
mysql_real_escape_string( $_REQUEST,  'eingabebereinigen' );

function eingabebereinigen(&$value, $key)
{
  $value = strip_tags($value, '<p><br /><b><strong>'); 
  $value = htmlspecialchars($value, ENT_QUOTES);
  $value = trim($value);
}
?>

Ist das so richtig? Ich hoffe mal!

Meine Captcha.php habe ich übrigens hinbekommen, zwar nicht mit dem zuvor probierten Billie-Script.
Bei der Einbindung funktioniert es auch schon ganz gut, nur noch nicht ganz fehlerfrei,

PHP:
<form name="" action="<?php echo $_SERVER['PHP_SELF']; ?>" 
 method="POST" enctype="text/html">
<p><span class="bold">Ihr Name:</span><br />
<input type="text" name="name" value="" size="50" maxlength="150" />
</p>
<p><span class="bold">Ihre E-Mail-Adresse:</span><br />
<input type="text" name="email" value="" size="50" maxlength="150" />
</p>
<p><span class="bold">G&auml;stebucheintrag:</span><br />
<textarea name="eintrag" rows="10" cols="50"></textarea>
</p> 

<img src="CaptchaCheckImages.php" alt="captcha" /> 
<input id="security_code" name="security_code" type="text" />

<input type="Submit" name="" value="speichern" /> 
</form> 

<?php 
mysql_real_escape_string ( $_POST,    'eingabebereinigen' );
mysql_real_escape_string ( $_GET,     'eingabebereinigen' );
mysql_real_escape_string( $_REQUEST,  'eingabebereinigen' );

function eingabebereinigen(&$value, $key)
{
 $value = strip_tags($value, '<p><br /><b><strong>'); 
$value = htmlspecialchars($value, ENT_QUOTES);
$value = trim($value);
}
?>

<?php 
   session_start();
   if(($_SESSION['security_code'] == $_POST['security_code']) && (!empty($_SESSION['security_code'])) ) 
     
if ( $_POST['name'] != "" ) 
if ( $_POST['eintrag'] != "" ) 
{
$sql = " INSERT INTO gaestebuch ";
$sql .= " SET ";
$sql .= " name   ='". $_POST['name'] ."', ";
$sql .= " email  ='". $_POST['email'] ."', ";
$sql .= " datum  ='". date("Y-m-d H:i:s") ."', ";
$sql .= " eintrag='". $_POST['eintrag'] ."' "; 
 unset($_SESSION['security_code']);
   } else {
      echo 'Bitte versuchen Sie es noch einmal!';
   }
?>
<?php
require_once ('konfiguration.php'); 
$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_link )
$db_sel = mysql_select_db( MYSQL_DATENBANK )
    or die("Auswahl der Datenbank fehlgeschlagen"); 
	// ausführen des mysql-Befehls
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
echo  '<p><span class="bold">Bitte füllen Sie das Formular vollst&aumlndig aus</span></p>'; 
} 
else
echo '<p class="bold"><a href="gaestebuch.php">G&auml;stebuch anzeigen</a></p>';
exit; 
?>

Ich bekomme nun die Fehlermeldung, dass sql
($db_erg = mysql_query( $sql );
nicht definiert sei. (Letzter Teil in php)

Und noch ein Fehler.
Der Hinweis: Bitte füllen Sie das Formular vollständig aus, steht schon beim 1. Seitenaufruf dort. Er sollte erst dort stehen, wenn das Formular unvollständig abgesendet wurde. (Auch im letzten Teil)

Der Vollständigkeit halber gebe ich hier noch die captcha-php an:
PHP:
<?php
session_start();
 
class CaptchaCheckImages {
 
   var $font = 'arialf';
 
   function generateCode($characters) {
      /* list all possible characters, similar looking characters and vowels have been removed */
      $possible = '23456789bcdfghjkmnpqrstvwxyz';
      $code = '';
      $i = 0;
while ($i < $characters) { 
         $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
         $i++;
      }
      return $code;
   }
 
   function CaptchaCheckImages($width='150',$height='40',$characters='6') {
      $code = $this->generateCode($characters);
      /* font size will be 75% of the image height */
      $font_size = $height * 0.75;
      $image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
      /* set the colours */
      $background_color = imagecolorallocate($image, 255, 255, 255);
      $text_color = imagecolorallocate($image, 20, 40, 100);
      $noise_color = imagecolorallocate($image, 100, 120, 180);
      /* generate random dots in background */
      for( $i=0; $i<($width*$height)/3; $i++ ) {
         imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
      }
      /* generate random lines in background */
      for( $i=0; $i<($width*$height)/150; $i++ ) {
         imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
      }
      /* create textbox and add text */
      $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
      $x = ($width - $textbox[4])/2;
      $y = ($height - $textbox[5])/2;
      imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
      /* output captcha image to browser */
      header('Content-Type: image/jpeg');
      imagejpeg($image);
      imagedestroy($image);
      $_SESSION['security_code'] = $code;
   }
 
}
 
$width = isset($_GET['width']) && $_GET['width'] < 600 ? $_GET['width'] : '150';
$height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '40';
$characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';
 
$captcha = new CaptchaCheckImages($width,$height,$characters);
 
?>

Wie bekomme ich nun die noch vorhandenen Fehler weg und ist der Rest jetzt ok? Vielen lieben Dank im Voraus!
LG Astra :)
 
Was die Sicherheit betrifft, reicht mysql_real_escape_string() alleine aus, um Werte für die Nutzung in MySQL-Abfragen vorzubereiten. Schau dir lieber mal an, was genau die einzelnen Funktionen machen.
 

Neue Beiträge

Zurück