Benutzer-Werkzeuge

Action disabled: source

Captcha Code gegen Bots

Anwendungsgebiet

Jeder Bertreiber eines Forums, Blogs oder Wikis kennt das Problem von Spam Einträgen durch sogenannte Bots. Es ist schwierig diese gänzlich zu unterbinden, aber mit folgendem Code sollten zumindest die meisten Bots ausgesperrt bleiben

Lizenz

Alle Codes unterstehen der GNU GPL

Verwendung

Der Code besteht aus zwei Dateien. Zum einen eine captcha.php, die als src beim img-Tag im Formular angegeben wird und zum anderen die index.php, welche das Formular enthält

<?php
header('Content-type: image/gif');
randomString(5);
$res = createCaptcha($_SESSION['captcha_spam']);
imagegif($res);
imagedestroy($res);
exit; 
?>

Code

captcha.php

Diese Datei stellt drei Funktionen zur Verfügung. Zum einen randomString() welche einen zufälligen String mit der Länge $len zurückgibt resp den String in eine Session Variable schreibt. Auf diesen Session Wert greift dann createCaptcha() zurück, um diesen String als Captcha Code zu verwenden. Dazu gibt es noch die Funktion computeAVGRGB(), die anhand des vorgegebenen Hintergrundbildes die durchschnittlichen RGB Werte berechnet. Dies soll helfen die Schrift weniger deutlich vom Hintergrund abzuheben und es damit Bots und ihrer OCR Software erschweren, den Text aus dem Bild auszulesen.

<?php
session_start();
function randomString($len) {
    $possible = array_merge(range('a','h'),range('A','H'),range('j','z'),range('J','Z'),range(2,9));
    shuffle($possible);
    $_SESSION['captcha_spam'] = implode('',array_slice($possible,0,$len));
}
 
function createCaptcha($text){
    $im_bg = imagecreatefromgif($_SERVER['DOCUMENT_ROOT'].'/captcha/bilder/captcha-background.gif');
    $color = computeAvgRGB();
    $red_up = min(round(1.5*$color[0]),255);
    $red_down = max(round(0.2*$color[0]),1);
    $green_up = min(round(1.15*$color[1]),255);
    $green_down = max(round(0.15*$color[1]),1);
    $blue_up = min(round(1.4*$color[2]),255);
    $blue_down = max(round(0.2*$color[2]),1);
    $txt_ttf = $_SERVER['DOCUMENT_ROOT'].'/captcha/ttf/captcha3.ttf';
    $t_x = 30;
    $t_y = 55;
    for($i=0;$i<strlen($text);$i++){
      $font_size = rand(25,40);
      $angle = rand(-15,+15);
      $red = rand($red_down,$red_up);
      $green = rand($green_down,$green_up);
      $blue = rand($blue_down,$blue_up);
      $versatz = rand(-15,15);
      imagecolorset($im_bg,90+$i,$red,$green,$blue);
      $bbox = imageftbbox($font_size,$angle,$_SERVER['DOCUMENT_ROOT'].'/captcha/ttf/captcha3.ttf',$text{$i});
      imagettftext($im_bg, $font_size, $angle, $t_x, $t_y+$versatz, 90+$i, $txt_ttf,$text{$i});
      $width = abs($bbox[0]) + abs($bbox[2]);
      $t_x += $width += 3;
    }
    return $im_bg;
}
 
function computeAvgRGB(){
  $res = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT'].'/captcha/bilder/captcha-background.jpg');
  $width = imagesx($res);
  $height = imagesy($res);
  $r = 0;
  $g = 0;
  $b = 0;
  for($y=1;$y<$height;$y++){
    for($w=1;$w<$width;$w++){
      $rgb = imagecolorat($res, $w, $y);
      $r += ($rgb >> 16) & 0xFF;
      $g += ($rgb >> 8) & 0xFF;
      $b += $rgb & 0xFF;
    }
  }
  $r = round($r/($width*$height));
  $g = round($g/($width*$height));
  $b = round($b/($width*$height));
  return array($r-30,$g-50,$b-20);
}
?>

index.php

Diese Datei enthält das Formular, welches das Captcha Bild anzeigt und die Daten des Users entgegennimmt und verifiziert

<?php
session_start();
?>
<html>
<head>
<title>
Captcha Check
</title>
</head>
<body>
<form action="<?php echo $_SERVER['PHP_SELF'].'?'.strip_tags(SID);?>" method="post">
<img src="/captcha/captcha.php?<?php echo strip_tags(SID);?>" /><br />
<input type="text" name="code" /><br />
<input type="submit" name="senden" />
</form>
</body>
</html>

Source Code

Und hier gibt es die Source als zip File (inkl Bilddatei)

Melden Sie sich an, um einen Kommentar zu erstellen.

Seiten-Werkzeuge