Stand-Alone & Anpassungen devAScms Webradio Edition devAScms DJ Edition devAScms Design Templates
Sehr geehrter Besucher,
ich entschuldige mich für den stellenweise verunstalteten (ältere Programmierung traf auf neuere Serversoftware) und manchmal nicht mehr ganz aktuellen Webauftritt. Der Neuaufbau von devAS.de ist in Planung, aber da Kunden immer Vorrang haben, kann sich das noch etwas hinziehen.

Danke für das Verständnis
A. Schramm
Inhaber devAS.de - Webprogrammierung
Datum: 30.08.2009 (5066x gelesen)
Name: Andreas / Webseite: http://www.devAS.de
=> zurück zur Übersicht

Simples Captcha per Session

Wer kennt das nicht: Man hat ein Gästebuch und gerät damit dummerweise auf die Use-Liste eines Spammers. Per Script bekommt man dann schön regelmäßig den Müll ins Gästebuch. Um das ein klein wenig einzuschränken, kann man ein Captcha einbauen.

Das hier beschriebene Captcha ist so gehalten, dass es sehr vielseitig einsetzbar ist. So hab ich es zb hier in die Registrierung auf dem WSB eingebaut, aber auch auf dem Witzlicht.de - Gästebuch

Fängen wir also an und klären mal die Grundgeschichte.
Wir haben also ein Gästebuch und dazu ein Seite mit dem Eintrageformular ... nennen wir sie gb-eintragsformular.php. Eine weitere Seite, um den Eintrag in einer Datenbank zu speichern, brauchen wir ja auch noch .... nennen wir sie gb-datenbankeintrag.php

Dieses Tutorial geht davon aus, dass nomalerweise in dem Gästebuch keine Session benutzt wird.

zu allererst erstellen wir 2 neue Dateien.

captcha_img.php
(diese Datei generiert das Bild)
<?PHP
require("captcha_options.php");
session_start();
if(!
$_SESSION['captcha_string'])die();

header ("Content-type: image/png");
mt_srand((double)microtime()*1000000);
$string $_SESSION['captcha_string'];

$font  5;
$width  ImageFontWidth($font) * strlen($string)+20;
$height ImageFontHeight($font)+10;

$im = @imagecreate ($width,$height);
$background_color hex_to_rgb($code_gbcolor,$im);
$text_color hex_to_rgb($code_textcolor,$im);
$bcolor hex_to_rgb($code_punktcolor,$im);

for(
$i=0;$i<=$code_punkteanzahl;$i++){
mt_srand((double)microtime()*1000000);
$p_x1 mt_rand(0,$width);
$p_y1 mt_rand(0,$height);

$p_x2 mt_rand(0,$width);
$p_y2 mt_rand(0,$height);
imagesetpixel $im$p_x1$p_y1$bcolor );
}

imagestring ($im$font105,  $string$text_color);
imagepng ($im);

# hex_to_rgb
# <a href='http://http://www.webstyleboard.de/t3945' target='_blank'>http://www.webstyleboard.de/t3945</a>
function hex_to_rgb($color,$im) {
    
$color preg_replace("/#/"""$color);
    for (
$i 0$i 6$i += 2) {
        
$rgb[] = hexdec(substr($color$i2));
    }
    return 
ImageColorAllocate ($im$rgb[0], $rgb[1], $rgb[2]);
}
?>
captcha_options.php (wie der Name schon sagt: hier werden einige Optionen festgelegt)
<?PHP
##########################################################
# Modifikation: simples Captcha per Session by TNS       #
# Version: 1.0 vom 28.06.2005                            #
# von: TNS / www.devas.de / www.webstyleboard.de                       #
##########################################################

### Sicherheitscode aktiv, dann "true" eintragen, ansonsten "false"
$set_sicherheitscode "true";

### Hintergrundfarbe des Codebildes
$code_gbcolor "#FFFFFF";

### Textfarbe des Codebildes
$code_textcolor "#000000";

### Farbe der Punkte
$code_punktcolor "#ADADAD";

### Anzahl der Punkte auf dem Codebild
$code_punkteanzahl 200;

### Rahmendicke um das Codebild (O = ohne Rahmen)
$code_bordersize 1;

### Rahmenfarbe
$code_bordercolor "#000000";




#####################################
# Standardeinstellung
#####################################
# $set_sicherheitscode = "true";
# $code_gbcolor        = "#FFFFFF";
# $code_textcolor      = "#000000";
# $code_punktcolor     = "#ADADAD";
# $code_punkteanzahl   = 200;
# $code_bordersize     = 1;
# $code_bordercolor    = "#000000";
#####################################
?>
Mit diesen beiden Dateien haben wir nun die Grundvoraussetzungen erfüllt. Kommen wir nen dazu, die erste Datei zu verändern ... und zwar die gb-eintragsformular.php An den Anfang dieser Datei kommt folgender PHP-Code:
<?php
### Dateiänderung 1 für den simple-Captcha-by-TNS
 
require("captcha_options.php");
 if(
$set_sicherheitscode=="true"){
 
session_start();
 
$_SESSION['captcha_string'] = mt_rand(10000,99999);
 }
 
### Ende Dateiänderung 1
?>
Damit das auch alles so seinen Sinn macht, muss das Formular ein wenig erweitert werden und zwar um das Bild mit dem Zahlen und einem Textfeld
<img src="captcha_img.php" alt="" />
<input type="text" name="captcha_str" value="" /> 5stelligen Code eintragen
Kommen wir nun zu der Datei: gb-datenbankeintrag.php Am Anfang dieser Datei müssen wir natürlich auch hier erstmal die Session starten:
<?php
### Dateiänderung 2 für den simple-Captcha-by-TNS
 
require("captcha_options.php");
 if(
$set_sicherheitscode=="true"){
 
session_start();
 }
 
### Ende Dateiänderung 2
?>
jetzt müssen wir natürlich noch testen, ob der Code stimmt, den der Mensch da einträgt. In der Datei gb-datenbankeintrag.php wird ja zumeist auch einiges überprüft, bevor man den Gästebucheintrag in die Datenbank lässt. in diese Überprüfung bauen wir nun folgendes ein:
<?php
### Dateiänderung 3 für den simple-Captcha-by-TNS
  
if($set_sicherheitscode=="true"){
  if(isset(
$_POST['captcha_str'])) $_POST['captcha_str'] = trim($_POST['captcha_str']);
  if(
$_POST['captcha_str']!=$_SESSION['captcha_string']){
    
// ERROR ERROR ERROR ;)
    // mache was, denn der eingegebene Code ist falsch oder fehlt
  
}
  }
  
### Ende Dateiänderung 3
?>
Das war es schon. :) Ich hoffe ich konnte weiterhelfen.