# Captcha ins Gästebuch einbauen!?



## ClouD361 (4. Oktober 2007)

Moin,
ich habe mir hier ein Captcha Tutorial angeguckt und soweit klappt alles. Nun möchte ich dieses "Script" in mein Gästebuch einbauen, kriege das aber nicht hin.

Das Captcha Script habe ich genau nach dem Tutorial gemacht also es funktioniert (Lob an Billie). hier

Der Gästebuch Quelltext sieht so aus:


```
<?

$form_name = $_POST['form_name'];
$form_message = $_POST['form_message'];
$form_mail = $_POST['form_mail'];
$hp_pre = "http://";
if($_POST['submit']){
	// Correct HP
	$hp_pre = "";
	//check for errors
	if(!$_POST['form_name']){
		$error .= "Plese enter a Name<br>\n";
	} 
	if(!$_POST['form_message']) {
		$error .= "Plese enter a Message<br>\n";
	}
}
if($_POST['submit'] && !$error){
$sql = "INSERT INTO gbook (datum,name,msg,email,pub) VALUES (NOW( ),'$form_name','$form_message','$form_mail','0')";

	if($result = mysql_query($sql,$db_con)){
		?>
		<table width="400" border="0" cellspacing="0" cellpadding="0">
		  <tr>
		    <td align="center">
				<div style="border:1px solid #7D0000; width:300; height: 150; text-align:center; padding:10px;">
				<br><br><h3>Dein Eintrag wurde Aufgenommen!</h3>
				Da dies jedoch ein "moderiertes" G&auml;stebuch ist, muss er erst Durch uns freigeschaltet werden, 
				was in der Regel nicht länger als 3 Tage dauert.
				</div>
			</td>
		  </tr>
		</table>
		<br>
		<?
	}
	if (!$result) {
   die('Ungültige Abfrage: ' . mysql_error());}
} else {
//echo "<span class=\"error\">$error</span>";
?>
<form action="<? $PHP_SELF ?>" method="post" name="contact">
<table width="400" class="Stil1" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="70">Name:</td>
    <td width="330"><input style="width:330;" type="text" name="form_name" value="<?=$_POST['form_name'] ?>" size="45" class="form"></td>
  </tr>
  <tr>
    <td>eMail:</td>
    <td><input type="text" style="width:330;" name="form_mail" value="<?=$_POST['form_mail'] ?>" size="45" class="form"></td>
  </tr>
  <tr>
    <td><br>Message:</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
  	<td>&nbsp;</td>
    <td><textarea style="width:330;" name="form_message" rows="7" class="form"><?=$_POST['form_message'] ?></textarea></td>
  </tr>
   <tr>
    <td colspan="2" align="right"><div id="errordiv"><? echo "<span class=\"error\">$error</span>" ?></div><input name="submit" type="submit" value="Send" class="formbu">&nbsp;<input name="reset" type="reset" value="Rset" class="formbu"></td>
  </tr>
</table>

</form>
<?
}
?>
```

So sieht es dann im Browser aus. hier

Könnt ihr mir bitte helfen.

Gruß ClouD361


----------



## andy72 (4. Oktober 2007)

Um Dir zu helfen, benötige ich die Funktion/Klassenmethden des Captchas - Bitte poste mal den Code dazu 

Dein GB-Script ist soweit ok, jedoch solltest Du VOR dem Insert die $_POST-Variablen anders prüfen:


```
if($_POST['submit']){ 
    // Correct HP 
    $hp_pre = ""; 
    //check for errors 
    if(!$_POST['form_name'] || empty($_POST['form_name']) ){ 
        $error .= "Plese enter a Name<br>\n"; 
    }  
    if(!$_POST['form_message'] || empty($_POST['form_message']) ) { 
        $error .= "Plese enter a Message<br>\n"; 
    } 
}
```

Und VOR dem Insert die $_POST-Variablen noch escapen, um die Datenbank zu schützen:

```
$sql = "INSERT INTO gbook (datum,name,msg,email,pub) VALUES (NOW( ),'".mysql_real_escape_string($form_name)."','".mysql_real_escape_string($form_message)."','".mysql_real_escape_string($form_mail)."','0')";
```

LG
Andy


----------



## ClouD361 (4. Oktober 2007)

Beim Captcha Script gibt es 3 Dateien.
1. captcha.php 
sieht so aus:


```
<?php

    $CAPTCHA_LENGTH = 5;    // Länge der Captcha-Zeichenfolge, hier fünf Zeichen
    $FONT_SIZE      = 18;   // Schriftgröße der Zeichen in Punkt
    $IMG_WIDTH      = 150;  // Breite des Bild-Captchas in Pixel
    $IMG_HEIGHT     = 30;   // Höhe des Bild-Captchas in Pixel

    // Liste aller verwendeten Fonts
    $FONTS[] = './ttf/dum13d';
	$FONTS[] = './ttf/actionj';


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

    $link = mysql_connect('Host', 'User', 'pw');
    mysql_select_db('Datenbankname', $link);


    $sql = 'SELECT
                *
            FROM
                `captcha`
            WHERE
                `captcha_phpsessid` = \''.$_GET['PHPSESSID'].'\'
            LIMIT
                1';

    $result = mysql_query($sql, $link);

    if(mysql_num_rows($result) > 0) {

        $sql = 'UPDATE
                    `captcha`
                SET
                    `captcha_time` = '.time().',
                    `captcha_captcha` = \''.$captcha.'\'
                WHERE
                    `captcha_phpsessid` = \''.$_GET['PHPSESSID'].'\'
                LIMIT
                    1';
        mysql_query($sql, $link);

    } else {

        $sql = 'INSERT INTO
                    `captcha`
                    (
                        `captcha_phpsessid`,
                        `captcha_time`,
                        `captcha_captcha`
                    )
                VALUES
                    (
                        \''.$_GET['PHPSESSID'].'\',
                        '.time().',
                        \''.$captcha.'\'
                    )';
        mysql_query($sql, $link);
    }

    $sql = 'DELETE FROM
                `captcha`
            WHERE
                `captcha_time` <= '.(time() - 300);

    mysql_query($sql, $link);
    mysql_close($link);
?>
```

2. form.inc.php
sieht so aus:

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=uft-8" />
<title>Captcha Tutorial</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="index.php?<?php echo SID; ?>">
  <table border="0" cellspacing="0" cellpadding="0">
    <tr>
      <td>Ihr Name:</td>
       <td><input type="text" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" /><?php echo $error_name; ?></td> 
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td>Captcha:</td>
      <td><input type="text" name="captcha" value="" /><?php echo $error_captcha; ?></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
       <td><img src="captcha.php?<?php echo SID; ?>" width="150" height="50" alt="Bild-Captcha" /></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" name="validate" value="Senden" />
      </td>
    </tr>
  </table>
</form>
</body>
</html>
```

3. index.php
sieht so aus:

```
<?php

session_start();
$form_valid = false;

if(isset($_POST['validate'])) {

    $form_valid = true;

    $name = trim($_POST['name']);

    if(strlen($name) < 3) {

        $form_valid = false;
        $error_name = 'Bitte geben Sie einen Namen ein (mind. 3 Zeichen).';
    }


    $link = mysql_connect('Host', 'User', 'pw');
    mysql_select_db('Datenbankname', $link);

    $sql = 'SELECT
                *
            FROM
                `captcha`
            WHERE
                `captcha_phpsessid` = \''.$_GET['PHPSESSID'].'\'
            AND
                `captcha_captcha` = \''.$_POST['captcha'].'\'
            LIMIT
                1';

    $result = mysql_query($sql, $link);

    if(mysql_num_rows($result) <= 0) {

        $form_valid = false;
        $error_captcha = 'Bitte geben Sie den gültigen Captcha-Code ein.';
    }
}

if($form_valid) {

    echo 'Hallo, '.$name;

} else {

    include('form.inc.php');
}
?>
```

Das ist der Quelltext vom Captcha. Habe ich zu 99% vom tutorial übernomen. Die Datenbankdaten habe ich rausgenommen.

ps: Das Gästebuch habe ich nicht geschrieben. Ich kann leider kein php ich hab nur versucht irgendwie logisch vorzugehen und das Captcha irgendwie einzubinden, was leider nicht geklappt hat.


----------



## ClouD361 (5. Oktober 2007)

Sorry Leute ich muss das hier mal eben pushen, in der Hoffnung, dass es jemand liest und mir helfen kann.

Gruß ClouD361


----------

