Captcha-Grafik mit PHP erzeugen

Diese PHP-Funktion erstellt eine PNG-Grafik und gibt diese aus für eine Zusammenarbeit mit einer Captcha-Sicherung. Es wird die GD-Library benötigt.

Captcha-Grafik Beispiel

mixed createcaptcha(int $width, int $height, int $letters, string $font)

$width entspricht der Breite der erzeugten Captcha-Grafik.

$height entspricht der Höhe der erzeugten Captcha-Grafik.

$letters ist die Anzahl an Buchstaben in der Grafik.

$font ist der Pfad zu einer TTF-Fontdatei (Schriftartdatei). (siehe myfont.de)

Rückgabewerte

Bei Erfolg wird ein String (Zeichenkette) der Länge $letters zurückgegeben, welcher die in der erzeugten Grafik enthaltenen Zeichen enthät. Bei eine  Fehler (z.B. Fontfile wurde nicht gefunden) wird false geliefert.

Sourcecode

<?php

/*
 * @author vlmedia
 * @version 2010-12-18
 * @param int $width Width of the graphic
 * @param int $height Height of the graphic
 * @param int $letters Number of letters in graphic
 * @param string $font Path to ttf-fontfile
 *
 * @return mixed $return false on failure, string with captcha-code on success
 *
 * This is a simple captcha-image generator in PHP
*/
function createcaptcha($width, $height, $letters, $font){

	$width = (int)$width;
	$height = (int)$height;
	$letters = (int)$letters;
	$font = (string)$font;
	if(!file_exists($font) || !is_file($font))
		return false;

	$image = imagecreatetruecolor($width, $height); // create image
	imagefill($image, 0, 0, imagecolorresolve($image, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255))); // fill background
	$spl = $width / $letters; // space per letter
	$al = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', '6',
				'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', '7',
				'q', 'r', 's', 't', 'u', 'v', 'w', 'x', '8',
				'y', 'z', '1', '2', '3', '4', '5', '9'); // available letters
	$code = '';
	for($i = 1; $i <= 4; $i++){
		$p = mt_rand(1, 2);
		$linecolor = imagecolorresolve($image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));
		$x1 = mt_rand(1, $width);
		$x2 = mt_rand(1, $width);
		$y1 = mt_rand(1, $height);
		$y2 = mt_rand(1, $height);
		imagesetthickness($image, mt_rand(2,10));
		switch($p){
			case 1:
				imageline($image, $x1, $y1, $x2, $y2, $linecolor);
				break;
			case 2:
				imagedashedline($image, $x1, $y1, $x2, $y2, $linecolor);
				break;
		}
	}
	$code = '';
	for($i = 1; $i <= $letters; $i++){
		$ls = mt_rand(15, 20); // letter's size
		$lminml[$i] = ($i-1)*$spl; // letter's mindest margin left
		$lml = mt_rand($lminml[$i], $lminml[$i] + ($spl/2)); // letter's margin left
		$lmt = mt_rand($ls+10, $height-10); // letter's margin top
		$la = mt_rand(-10, 10); // letter's angle
		$lc = imagecolorresolve($image, mt_rand(0, 210), mt_rand(0, 210), mt_rand(0, 210)); // letter's color
		$l = $al[array_rand($al)]; // letter
		imagettftext($image, $ls, $la, $lml, $lmt, $lc, $font, $l); // set letter on image
		$code .= $l;
	}
	imagepng($image);
	imagedestroy($image);
	return $code;

}

?>

Beispiel

<?php
header("Content-Type: image/png"); // Ausgabe als PNG-Grafik
header("Cache-Control: no-cache,no-store"); // Soll nicht gecacht oder gespeichert werden.

include "createcaptcha.php"; // Datei mit Sourcecode wird inkludiert

$captcha = createcaptcha(140, 30, 6, "testfont.ttf"); // Grafik wird ausgegeben

/*
Nachfolgend kann $captcha weiter verarbeitet werden. Die Variable enthält bei Erfolg den Sicherheitscode der Grafik.
*/

?>

Anmerkungen

Der von der Funktion zurückgegebene Sicherheitscode kann in einer Session gespeichert werden. Nachdem ein Benutzer z.B. ein Formular mit Captcha-Sicherung ausgefüllt hat, lässt sich die Eingabe mit der Zeichenkette der Session vergleichen.

Dieser Artikel wurde vertaggt mit , , , , , , .
Kategorien: Funktionen, PHP

Hat Ihnen dieser Artikel gefallen? - Dann abonnieren Sie vlblog um über neue Themen rund ums Web informiert zu werden.

Hinterlasse eine Antwort