tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
425
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DieAstra DieAstra ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    5
    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-Code:
    <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($valueENT_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_HOSTMYSQL_BENUTZERMYSQL_KENNWORT);
    if ( ! 
    $db_link )
    {
       
    }
    $db_sel mysql_select_dbMYSQL_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
     

  2. #2
    campari campari ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    267
    Es fehlt der Captcha-relevante Teil.
    Was soll "Billies Programm" sein?
     

  3. #3
    DieAstra DieAstra ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    5
    Ups, sorry! Ich dachte, es liegt grundsätzlich an meinem Code. Hier also das abgeänderte Skript von Billie:

    PHP-Code:
    <?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($imgrand(200255), rand(200255), rand(200255)); 

        
    // Wir füllen das komplette Bild mit der zuvor definierten Farbe 
        
    imagefill($img00$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(0count($ALPHABET) - 1)]; // ein zufälliges Zeichen aus dem definierten Alphabet ermitteln 
            
    $captcha .= $chr// Der Zeichenfolge $captcha das ermittelte Zeichen anfügen 

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

            
    $y 25 rand(020); // die y-Koordinate mit einem Mindestabstand plus einem zufälligen Wert festlegen 
            
    $angle rand(030); // 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
     

  4. #4
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    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
     

  5. #5
    DieAstra DieAstra ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    5
    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
     

  6. #6
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Etwas anderes: Deine eingabebereinigen()-Funktion eignet sich nicht als Schutz vor SQL-Injektionen. Verwende dafür die mysql_real_escape_string()-Funktion.
     
    Markus Wulftange

  7. #7
    DieAstra DieAstra ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    5
    Ja, danke! Auch wenn meine eigentliche Frage leider noch ohne Antwort ist!

    LG Astra
     

  8. #8
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Dann beseitige erst mal die genannte Fehler der Reihe nach, wie sie gemeldet wurden.
     
    Markus Wulftange

  9. #9
    DieAstra DieAstra ist offline Rookie
    Registriert seit
    Dec 2008
    Beiträge
    5
    Hi Markus,
    also, denn schau doch bitte mal!

    PHP-Code:
    <?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($valueENT_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-Code:
    <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($valueENT_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_HOSTMYSQL_BENUTZERMYSQL_KENNWORT);
    if ( ! 
    $db_link )
    $db_sel mysql_select_dbMYSQL_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-Code:
    <?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($possiblemt_rand(0strlen($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($image255255255);
          
    $text_color imagecolorallocate($image2040100);
          
    $noise_color imagecolorallocate($image100120180);
          
    /* generate random dots in background */
          
    for( $i=0$i<($width*$height)/3$i++ ) {
             
    imagefilledellipse($imagemt_rand(0,$width), mt_rand(0,$height), 11$noise_color);
          }
          
    /* generate random lines in background */
          
    for( $i=0$i<($width*$height)/150$i++ ) {
             
    imageline($imagemt_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_size0$this->font$code) or die('Error in imagettfbbox function');
          
    $x = ($width $textbox[4])/2;
          
    $y = ($height $textbox[5])/2;
          
    imagettftext($image$font_size0$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'] > $_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
     

  10. #10
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    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.
     
    Markus Wulftange

Ähnliche Themen

  1. Probleme mit Captcha
    Von julchen im Forum PHP
    Antworten: 0
    Letzter Beitrag: 20.11.09, 09:03
  2. Captcha problem
    Von BigR16 im Forum PHP
    Antworten: 11
    Letzter Beitrag: 14.01.09, 09:58
  3. [JSP] Captcha
    Von SeeSharpNewBee im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 13.02.08, 14:26
  4. Captcha sicher?
    Von ThaNewbie im Forum PHP
    Antworten: 4
    Letzter Beitrag: 17.05.07, 11:37
  5. CAPTCHA Problem
    Von Nepheus im Forum PHP
    Antworten: 7
    Letzter Beitrag: 31.03.07, 15:29