<?php
/**
* Captcha Bild Überprüfung
*
* Systemvoraussetzung:
* Linux, Windows
* PHP 4 >= 4.0.0-RC2 , PHP 5
* GD-Bibliothek ( > gd-1.6 )
* FreeType-Bibliothek
*
* Prüft ein Captcha-Bild
*
* LICENSE: GNU General Public License (GPL)
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* @category Captcha
* @author Damir Enseleit <info@selfphp.de>
* @copyright 2001-2006 SELFPHP
* @version $Id: captcha_check.php,v 0.10 2006/04/07 13:15:30 des1 Exp $
* @link http://www.selfphp.de
*/
/**
* Prüft ein Captcha-Bild
*
* @param string $codeCaptcha Hash-Wert
* @param string $stringCaptcha Eingabe durch den User
* @param string $dir Das Verzeichnis mit den Captcha-Bilder
* @param integer $delFile Die Zeit in Minuten, nachdem ein Captcha-Bild gelöscht wird
*
* @return bool TRUE / FALSE
*/
function CheckCaptcha($codeCaptcha,$stringCaptcha,$dir,$delFile=5)
{
// Setzt den Check erst einmal auf FALSE
$captchaTrue = FALSE;
// Übergebene Hash-Variable überprüfen
if(!preg_match('/^[a-f0-9]{32}$/',$codeCaptcha))
return FALSE;
// Übergebene Captcha-Variable überprüfen
if(!preg_match('/^[a-zA-Z0-9]{1,6}$/',$stringCaptcha))
return FALSE;
$handle = @opendir($dir);
while (false !== ($file = readdir($handle)))
{
if (preg_match("=^\.{1,2}$=", $file))
{
continue;
}
if (is_dir($dir.$file))
{
continue;
}
else
{
$lastTime = ceil((time() - filemtime($dir.$file)) / 60);
if($lastTime > $delFile)
{
unlink($dir.$file);
}
else{
if(strtolower($file) == strtolower($codeCaptcha.'_'.$stringCaptcha.'.png'))
{
$captchaTrue = TRUE;
}
if (preg_match("=^$codeCaptcha=i", $file))
{
unlink($dir.$file);
}
}
}
}
@closedir($handle);
if ($captchaTrue)
return TRUE;
else
return FALSE;
}
// Temporäres Verzeichnis der Captcha-Bilder
$captchaDir = 'captchadir/';
// Löschen der alten Captcha-Bilder nach wieviel Minuten
$delFile = 10;
// Überprüfung starten
$resultCaptcha = CheckCaptcha($_POST['codeCaptcha'],$_POST['stringCaptcha'],$captchaDir,$delFile);
?>
Alles anzeigen
<?php
/**
* Captcha Bild mit Farbverlauf
*
* Systemvoraussetzung:
* Linux, Windows
* PHP 4 >= 4.0.0-RC2 , PHP 5
* GD-Bibliothek ( > gd-1.6 )
* FreeType-Bibliothek
*
* Erstellt ein Captcha Bild mit Farbverlauf und 6 Buchstaben
* und Zahlen
*
* LICENSE: GNU General Public License (GPL)
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation.
*
* @category Captcha
* @author Damir Enseleit <info@selfphp.de>
* @copyright 2001-2006 SELFPHP
* @version $Id: captcha.php,v 0.10 2006/04/07 13:15:30 des1 Exp $
* @link http://www.selfphp.de
*/
/**
* Erstellt ein Array aus Gross-, Kleinbuchstaben und Zahlen
* Schlecht unterscheidbare Buchstaben und Zahlen werden ausgeschlossen
* Ausgeschlossen werden:
* i, I, l, L, o, O, 1, 0
*
* Können auch wahlweise mit
* range('A','Z');
* range('a','z');
* range(0,9);
* erzeugt werden
*
* @return array Liefert ein Array aus Buchstaben und Zahlen
*/
function MakeAlphabet()
{
// Grossbuchstaben erzeugen
for ($x = 65; $x <= 90; $x++) {
if($x != 73 && $x != 76 && $x != 79)
$alphabet[] = chr($x);
}
// Kleinbuchstaben erzeugen
for ($x = 97; $x <= 122; $x++) {
if($x != 105 && $x != 108 && $x != 111)
$alphabet[] = chr($x);
}
// Zahlen erzeugen
for ($x = 48; $x <= 57; $x++) {
if($x != 48 && $x != 49)
$alphabet[] = chr($x);
}
return $alphabet;
}
/**
* Erstellt einen Außenrahmen um das Captcha-Bild
*
* @param integer $imgWidth Breite des Bildes
* @param integer $imgHeight Höhe des Bildes
* @param resource $im Zeiger auf das Bild
* @param array $color Farbwerte im RGB-Format
*
* @return void
*/
function makeBorder($imgWidth,$imgHeight,$im,$color)
{
imageline($im,0,0,$imgWidth,0,$color);
imageline($im,0,$imgHeight-1,$imgWidth,$imgHeight-1,$color);
imageline($im,0,0,0,$imgHeight,$color);
imageline($im,$imgWidth-1,0,$imgWidth-1,$imgHeight,$color);
}
/**
* Erstellt den Farbverlauf im Captcha-Bild
*
* @param array $fromRGB Farbwerte im RGB-Format
* @param array $toRGB Farbwerte im RGB-Format
* @param integer $imgHeight Bildhöhe
*
* @return array Gibt ein Array für den Farbverlauf zurück
*/
function makeGradient($fromRGB,$toRGB,$imgHeight)
{
$diffR = ($fromRGB[0]-$toRGB[0]); //38
$diffG = ($fromRGB[1]-$toRGB[1]); //133
$diffB = ($fromRGB[2]-$toRGB[2]); // -6
$maxR = $diffR / $imgHeight; // 0.475
$maxG = $diffG / $imgHeight; // 1,66
$maxB = $diffB / $imgHeight; // 0.075
$maxNR = $maxR;
$maxNG = $maxG;
$maxNB = $maxB;
for($x=0;$x<$imgHeight;$x++)
{
$color['r'][$x] = abs($fromRGB[0] - $maxR);
$color['g'][$x] = abs($fromRGB[1] - $maxG);
$color['b'][$x] = abs($fromRGB[2] - $maxB);
$maxR += $maxNR;
$maxG += $maxNG;
$maxB += $maxNB;
}
return $color;
}
// TTF-Schrift
// Sie sollten hier unbedingt den absoluten Pfad angeben, da ansonsten
// eventuell die TTF-Datei nicht eingebunden werden kann!
$fileTTF = 'www.matthiasbutz.de/captcha/bddavinc.ttf';
// Verzeichnis für die Captcha-Bilder (muss Schreibrechte besitzen!)
// Ausserdem sollten in diesem Ordner nur die Bilder gespeichert werden
// da das Programm in regelmaessigen Abstaenden dieses leert!
// Kein abschliessenden Slash benutzen!
$captchaDir = 'captchadir';
// Schriftgröße
$size = 30;
//Bildgroesse
$imgWidth = 220;//200
$imgHeight = 80;//80
// Farbverlauf RGB-Wert Start und RGB-Wert Ende
$fromRGB = array(253,214,0);
$toRGB = array(215,81,6);
// Randfarbe
$colorBorder = array(154,53,2);
header("Content-type: image/png");
$im = @imagecreate($imgWidth, $imgHeight)
or die("GD! Initialisierung fehlgeschlagen");
// Definiert die Farbe für den Border
$colorB = imagecolorallocate($im,$colorBorder[0],$colorBorder[1],$colorBorder[2]);
// Erstellt den Farbverlauf
$colorRGB = makeGradient($fromRGB,$toRGB,$imgHeight);
for($x=0;$x<$imgHeight;$x++)
{
$r = $colorRGB['r'][$x];
$g = $colorRGB['g'][$x];
$b = $colorRGB['b'][$x];
$color = imagecolorallocate($im,$r,$g,$b);
imageline($im,0,$x,$imgWidth,$x,$color);
}
//Wortliste erstellen
$alphabet = MakeAlphabet();
// Array des Alphabets durchwürfeln
shuffle($alphabet);
$mix = range(0,255);
shuffle($mix);
$colors=array(
imagecolorallocate($im,$mix[0],$mix[6],$mix[12]),
imagecolorallocate($im,$mix[1],$mix[7],$mix[13]),
imagecolorallocate($im,$mix[2],$mix[8],$mix[14]),
imagecolorallocate($im,$mix[3],$mix[9],$mix[15]),
imagecolorallocate($im,$mix[4],$mix[10],$mix[16]),
imagecolorallocate($im,$mix[5],$mix[11],$mix[17])
);
// Zeichnet die Buchstaben und baut den Dateinamen auf
for($x=0;$x<6;$x++){
$angel = rand(-25,25);
$y = rand($size,$imgHeight-20);
imagettftext($im, $size, $angel, $next, $y, $colors[$x], $fileTTF,$alphabet[$x]);
$next += $size + ($imgWidth/$size);
$fileName .= $alphabet[$x];
}
// Border erstellen
makeBorder($imgWidth,$imgHeight,$im,$colorB);
// Uebermittelter Hash-Wert ueberpruefen
if(!preg_match('/^[a-f0-9]{32}$/',$_GET['codeCaptcha']))
$_GET['codeCaptcha'] = md5(microtime());
// Image speichern
imagepng($im,$captchaDir.'/'.$_GET['codeCaptcha'].'_'.$fileName.'.png');
imagedestroy($im);
// Bild ausgeben
readfile($captchaDir.'/'.$_GET['codeCaptcha'].'_'.$fileName.'.png');
?>
Alles anzeigen