Spamschutz mit Captcha

September 2009

Mit diesem Skript kann man Formulare gegen Spambots schützen. Es generiert eine Zeichenkette, welche als Bild dargestellt wird. Der Benutzer muss diesen Code korrekt in ein Textfeld schreiben. Falls dieser nicht mit dem Bild übereinstimmt, werden die Formulareingaben ignoriert.

Der sogenannte Captcha-Code wird mit dem Aufruf der form.php definiert und via Sessionvariable an die Datei captchaImg.php übergeben, die dann daraus die Grafik generiert, welches wiederum in der form.php angezeigt wird.

<?php
## form.php

session_start();

# Auswertung des Formulars/Captchas wenn es gesendet wird
if(isset($_POST['send'])){
  if(
$_POST['captchaForm'] != $_SESSION['captchaSess'])
    echo 
'Falscher Captcha-Code!';
  else
    echo 
'Captcha-Code ist korrekt!';
}

# Captcha generieren
# Captcha-Code in Session-Variable speichern
$_SESSION['captchaSess'] = randomString();

# zufälligen String generieren, bestehend aus 2 Vokalen und 2 Konsonanten
function randomString(){
  
$kons 'bcdfghjklmnpqrstvwxz';
  
$voka 'aeiou';
  return 
$kons[rand(0,19)].$voka[rand(0,4)].
         
$kons[rand(0,19)].$voka[rand(0,4)];
}
?>

<form action="<?php echo $_SERVER['REQUEST_URI'?>" method="post">
 <fieldset>
  <legend>Dein Formular</legend>
  Gib den Sicherheitscode ein:
  <img src="captchaImg.php?<?php echo SID ?>" alt="" />
  <input type="text" name="captchaForm" />
  <input type="submit" name="send" value="Absenden" />
 </fieldset>
</form>

Die Datei, welche das Bild generiert:
<?php
## captchaImg.php

session_start();
$code $_SESSION['captchaSess'];

# Hintergrundbild (png) (z.B. 80x36 px)
$bgimg 'background.png';
# Schriftart
$ttf 'myFont.ttf';
# Schriftgrösse
$ttfsize 20;

// Hintergrund laden
$img imagecreatefrompng($bgimg);
$imgw imagecreatefrompng($bgimg);

# Schriftfarbe
$color imagecolorallocate($imgrand(0,150), rand(0,150), rand(0,150));

// Code schreiben
$winkel rand(-6,6);
$x rand(8,14);
$y 24+$winkel;
imagettftext($img$ttfsize$winkel$x$y$color$ttf$code);

// Welle erzeugen
$wellenlaenge mt_rand(0,100)/400+0.05;
$w imagesx($img);
$h imagesy($img);
for(
$i=1$i<=$w$i++)
  
imagecopy($imgw$img$iround((sin($i*$wellenlaenge)*2))+3$i11$h);

// Bild ausgeben
header('Content-type: image/png');
imagepng($imgw);
?>
Hier wird zuerst das Hintergrundbild (zweimal) geladen. Anschliessend wird der Captcha-Code, welcher per Session übertragen wurde, mit ein paar zufälligen Werten in die Grafik geschrieben.
Danach wird der Grafik eine Wellenform verpasst. Damit dabei keine schwarzen Flecken entstehen, wird das gewellte Bild auf die duplizierte Hintergrundgrafik gelegt.

Mögliche Ausgabe der form.php:
Gib den Sicherheitscode ein:
 Bild: webscriptingData/files/captchaBsp.png


Siehe auch:
 


Andere Einträge


Kommentare

#1
von gerhard am 17.10.2011
Hi
Danke für dein Tutorial!
Ich habe aber folgendes Problem.
Wenn ich auf Absenden klicke, wird das $_SESSION['captchaSess']
immer neu generiert und passt bei der Abfrage nicht mehr!
Wo liegt der Hund begraben??

Beim <img src="captchaImg.php?<?php echo SID ?>" alt=" /> fehlt der zweite ".

Lieben Dank
Gerhard