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 [WIKI]Captcha[/WIKI] 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-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?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, $font, 10, 5, $string, $text_color);
imagepng ($im);
# hex_to_rgb
# [URL]http://www.webstyleboard.de/t3945[/URL]
function hex_to_rgb($color,$im) {
$color = preg_replace("/#/", "", $color);
for ($i = 0; $i < 6; $i += 2) {
$rgb[] = hexdec(substr($color, $i, 2));
}
return ImageColorAllocate ($im, $rgb[0], $rgb[1], $rgb[2]);
}
?>
|
captcha_options.php
(wie der Name schon sagt: hier werden einige Optionen festgelegt)
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<?PHP
##########################################################
# Modifikation: simples Captcha per Session by TNS #
# Version: 1.0 vom 28.06.2005 #
# von: TNS / [URL]www.webstyleboard.de[/URL] #
# [URL]http://www.webstyleboard.de/wsb/board.php?boardid=49[/URL] #
##########################################################
### 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-Quelltext
|
1
2
3
4
5
6
7
|
### 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
|
Quellcode
|
1
2
|
<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-Quelltext
|
1
2
3
4
5
6
|
### 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-Quelltext
|
1
2
3
4
5
6
7
8
9
|
### 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.
TheNobody Style
PS: Wenn irgendwas nicht so recht verstanden wird, dann einfach bescheid fragen