Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Dienstag, 28. Februar 2006, 15:20

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 [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$font105,  $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$i2));
    }
    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
Signatur von »TheNobody Style«

2

Montag, 6. März 2006, 12:28

Darf ich meckern? :D

PHP-Quelltext

1
2
3
session_start();
 if(!$_SESSION['captcha_string'])$_SESSION['captcha_string'] = mt_rand(10000,99999);
 }
so generierst du genau einmal je Session einen captcha_string, der sich auch nach wiederholtem Neuladen der Seite nicht ändert.

Besser wäre:

PHP-Quelltext

1
2
3
4
5
session_start();

//Hier eingegebenen Text mit captcha_string vergleichen

$_SESSION['captcha_string'] = mt_rand(10000,99999);
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

3

Mittwoch, 8. März 2006, 08:00

Ich habe es hier eingebaut:

http://www.krabbelzelt.de/empfehlung/index.php

Wenn ich die Seite im Firefox aufrufen, erscheint die Grafik nicht, erst wenn ich die Seite neulade. Woran könnte es liegen?

4

Mittwoch, 8. März 2006, 09:03

Das ist eher ein Problem des Feuervogels ... der Cache von dem Ding kann einen manchmal in den Wahnsinn treiben :dizzy:

@mrhappiness
jepp du sagst es und das hab ich auch so gewollt ... also ich hab mir dabei schon was gedacht --- auch wenn ich jetzt nimmer so recht weiss was --- aber im Endeffekt dürfte es keinen grossen Unterschied machen :suspicious: :-)
Signatur von »TheNobody Style«

5

Mittwoch, 8. März 2006, 14:19

Er zeigt aber auch nur den Code nihct an, also die Grafik...seltsam
Auch gerade im UE gestet erst kam das schöne rote X und nach neuladen ging es dann.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Neumanns« (8. März 2006, 14:21)


6

Donnerstag, 9. März 2006, 01:23

Zitat von »Neumanns«

Er zeigt aber auch nur den Code nihct an, also die Grafik...seltsam
Auch gerade im UE gestet erst kam das schöne rote X und nach neuladen ging es dann.

Also ich kann das Problem leider nicht nachvollziehen ... weder mit dem IE noch dem FF ... in beiden wird die Grafik sofort und ohne zu murren angezeigt :thumbsup:
Signatur von »TheNobody Style«

7

Donnerstag, 9. März 2006, 06:47

auf meiner Seite?

8

Donnerstag, 9. März 2006, 06:48

jepp :)
Signatur von »TheNobody Style«

9

Donnerstag, 9. März 2006, 07:04

dann werde ich es mal von einen anderen Computer testen...seltsam ist es schon

10

Donnerstag, 9. März 2006, 11:54

Zitat von »TheNobody Style«

@mrhappiness
jepp du sagst es und das hab ich auch so gewollt ... also ich hab mir dabei schon was gedacht --- auch wenn ich jetzt nimmer so recht weiss was --- aber im Endeffekt dürfte es keinen grossen Unterschied machen :suspicious: :-)
Der Unterschied ist:

Angenommen, ich wollte dein Gästebuch zuspammen, müsste ich nur einmal deine Seite im Browser aufrufen, mir die Zahl anschauen, die Session-ID raussuchen und schon kann's losgehen.

Solange mein Spamcode die Session-ID nutzt, die ich online zugewiesen bekam, kann ich automatisiert Einträge verfassen.
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

11

Donnerstag, 9. März 2006, 18:15

DAS ist natürlich ein Argument ... ich hab es mal in dem Tut geändert :-)
Signatur von »TheNobody Style«

12

Sonntag, 9. Juli 2006, 13:36

Hallo,

bei mir ist ein Fehler bei der Abfrage. Wenn ich einen Code eingebe egal ob er falsch oder keine eingegben wurde er zeigt mir keinen Fehler an. Kann mir mal jemand da helfen?

Gruß Kev

13

Sonntag, 9. Juli 2006, 14:12

Bitte solche Fragen im PHP-Forum stellen, da dies nen Einbaufehler zu sein scheint und kein Fehler im Tutorial. Danke. (sonst wird das hier zu overload)
Signatur von »TheNobody Style«