Willkommen in der Webstatt Zum Webstatt Blog und Stories
BNightSpeeder am 29.10.06 16:14

Hallo,

nachdem ich nun ein paar Überarbeitungen mit dem Script angestellt habe möchte ich nun hier mein Captcha Script zur verfügung stellen. Die Funktionsweise ist im Grunde dieselbe wie bei anderen Captchas auch, es wird ein Zufallscode mit PHP in einem Bild dargestellt und dann über Sessions übergeben.
Ich hoffe das dieses Captcha etwas einfacher an Webseiten angepasst werden kann als andere.

Da ich z.Z. keinen Webserver zur Verfügung habe hoffe ich das dieses Bild reicht:

DEMO
Da "fast" alles anpassbar ist, ist dies natürlich nur eine von 1000enden Möglichkeiten wie das Captcha aussehen kann.

Download
_______________________________

Voraussetzung: GD-Lib

Script:

Das Bild: (captcha.php)

<?php
session_start();
Header("Content-Type: image/png");

// (C) Captcha Script by - BNightSpeeder
// www.webstatt.org
// Dieses Script darf nicht ohne die Zustimmung des
// Autors auf anderen Seiten zum Download angeboten werden


// Variablen
##################################################
$klein = "1"; // Captcha auch zulassen wenn alle Buchstaben klein eingegeben wurden | 1 = Ja | 0 = Nein
$groß = "1"; // Captcha auch zulassen wenn alle Buchstaben groß eingegeben wurden | 1 = Ja | 0 = Nein

$randfonts = "1"; // Verschiedene Schriften auf einem Bild Zulassen | 1 = Ja | 0 = Nein
$angel = "1"; // Buchstaben um einem bestimmtem Winkel drehen | 1 = Ja | 0 = Nein
$angelmaxleft = "10"; // Maximaler Winkel nach Links gedrehter Buchstaben
$angelmaxright = "10"; // Maximale Winkel nach Rechts gedrehter Buchstaben
$fontsize = "1"; // Verschiedene Schriftgrößen Zulassen | 1 = Ja | 0 = Nein
$sizenormal = "12"; // Standard Schriftgröße || Falls Nein
$maxfontsize = "15"; // Größte Schriftgröße
$minfontsize = "10"; // Kleinste Schriftgröße


$randcolor = "1"; // Verschiedene Farben Zulassen | 1 = Ja | 0 = Nein
$fontcolor = "red"; //Falls $randcolor=0 bitte Farbe auswählen || Alle Farben sind in dem Array $color in Zeile 64
$rahmencolor = "black"; // Rahmen Farbe
$background = "white"; // Hintergrund Farbe
$rahmenlook = "1"; // Rahmen anzeigen | 1 = Ja | 0 = Nein

$ordner = "./fonts/"; //Ordner in dem die Fonts sind
$bg = "bg.png"; // Hintergrund Bild

$vonrand = "8"; //Anzahl der Pixel vom linkem Rand bis zum ersten Buchstaben
$vonrandoben = "25"; // Anzahl der Pixel bis zum Buchstaben vom oberem Rand
$pixel = "16"; //Entfernung in Pixeln von einem Buchstaben zum nächsten
$string = 4; // Anzahl der Zeichen die angezeigt werden sollen

$zeichen = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","1","2","3","4","5","6","7","8","9","0");
// Zeichen die im Bild als Code vorkommen können
##################################################


// Bildeigenschaften
##################################################
$ip = $_SERVER['REMOTE_ADDR']; //IP Adresse
$width = 100; // Breite (Nur falls Hintergrundbild nicht vorhanden)
$height = 35; // Höhe Nur falls Hintergrundbild nicht vorhanden)


if (file_exists($bg)) {
$img = imagecreatefrompng($bg);
$size = getimagesize($bg);
$width = $size[0];
$height = $size[1];
}
else {
$img = ImageCreate($width, $height);
}
##################################################


// Farben (Beliebig erweiterbar)
##################################################
$color["magenta"] = ImageColorAllocate($img, 255, 0, 255);
$color["orange"] = ImageColorAllocate($img, 255, 165, 42);
$color["brown"] = ImageColorAllocate($img, 165, 42, 42);
$color["yellow"] = ImageColorAllocate($img, 255, 255, 0);
$color["green"] = ImageColorAllocate($img, 0, 255, 0);
$color["blue"] = ImageColorAllocate($img, 0, 0, 255);
$color["red"] = ImageColorAllocate($img, 255, 0, 0);
$color["grey"] = ImageColorAllocate($img, 190, 190, 190);
$color["black"] = ImageColorAllocate($img, 0, 0, 0);
$color["white"] = ImageColorAllocate($img, 255, 255, 255);

##################################################


// Zufallszahlen oder Zufallszeichen
##################################################
$random = array();
$zc = count($zeichen);

for ($i=1;$i<=$string;$i++) {
$random[$i] = $zeichen[mt_rand(1,$zc)];
}

$random2 = implode("",$random);
##################################################


// Zufallsfont auswählen
##################################################
$i = "1";
$verz=opendir ($ordner);
while ($file=readdir($verz))
{
if (filetype($ordner.$file)!="dir")
{
$data[$i]=$file;
$i++;
}
}
closedir($verz);
$d = count($data);
$fonts = $data[rand(1,$d)];
##################################################


// Bild Inhalt
##################################################
if (file_exists($bg)) {
}
else {
ImageFill($img, 0, 0, $color[$background]);
}
if ($_GET["sess"]==session_id()) {
for ($i=1;$i<=$string;$i++) {
$entfernung[$i] = $pixel*$i;
$x = array_rand($color, 2);
( ( $x=="1" ) ? $size = mt_rand($minfontsize,$maxfontsize) : $size = $sizenormal );
$angelr = 360-$angelmaxright;
$angelrand = mt_rand(1,2);
( ( $fontsize=="1" ) ? $size = mt_rand($minfontsize,$maxfontsize) : $size = $sizenormal );
( ( $angelrand=="1" ) ? $angelfont = $angelr : $angelfont = $angelmaxleft );
( ( $randcolor==1 ) ? $rand = $color[$x[0]] : $rand = $color[$fontcolor] );
( ( $rand==$color[$background] ) ? $colorfont = $color[$fontcolor] : $colorfont = $rand );
imagettftext($img, $size, ( ( $angel==1 ) ? $angelfont : 0 ), $vonrand+$entfernung[$i], $vonrandoben, $colorfont, "" . $ordner ."" . ( ( $randfonts==1 ) ? $data[rand(1,$d)] : $fonts ) . "", $random[$i]);
}

// Rahmen
if ($rahmenlook=="1") {
ImageLine($img, 0, 0, 0, $height, $color[$rahmencolor] ); //Links
ImageLine($img, $width-1, 0, $width-1, $height, $color[$rahmencolor] ); //Rechts
ImageLine($img, 0, 0, $width, 0, $color[$rahmencolor] ); //Oben
ImageLine($img, 0, $height-1, $width-1, $height-1, $color[$rahmencolor]); //Unten
}
}
###################################################


// Session Variablen
###################################################
if ($klein=="1") {
$klein2 = strtolower($random2);
$_SESSION["klein"];
}
else {
$klein2 = 0;
}
if ($groß=="1") {
$groß2 = strtoupper($random2);
}
else {
$groß2 = 0;
}

$_SESSION["groß2"] = $groß2;
$_SESSION["groß"] = $groß;
$_SESSION["klein"] = $klein;
$_SESSION["klein2"] = $klein2;
$_SESSION["code"] = $random2;
$_SESSION["ip"] = $ip;
$_SESSION["sessbild"] = $_GET["sess"];
###################################################


ImagePNG($img); # Hier wird das Bild PNG zugewiesen
ImageDestroy($img) # Hier wird der Speicherplatz gereinigt
?>


Das Formular: (Dateiname egal)

<? session_start(); ?>
<img src="captcha.php?time=<?php echo microtime();?>&sess=<?=session_id();?>">
<br \>
<form name="form" method="post">
Captcha: <input name="captcha" type="text">
<input name="send" value="Senden" type="submit">
</form>

<?php
( ($_SESSION["klein"]=="1") ? $klein = $_SESSION["klein2"] : $klein = "0");
( ($_SESSION["groß"]=="1") ? $groß = $_SESSION["groß2"] : $groß = "0");
if ($_POST["captcha"]==$_SESSION["code"] OR $_POST["captcha"]==$groß OR $_POST["captcha"]==$klein AND $_SESSION["ip"]==$_SERVER['REMOTE_ADDR']) {

//Falls die Eingabe richtig war wird folgendes ausgeführt:
echo "True";

}
?>


Mfg. BNS

netcup.de Warum gibt es hier Werbung?
Snake am 29.10.06 16:26

Quote
Original von BNightSpeeder

<? check_captcha($_POST["captcha"]); //Funktion aufrufen

$check = check_captcha($_POST["captcha"]);
if (isset($check)) {

//Hier das was gemacht werden soll wenn das Captcha richtig ist!

}
?>


warum rufst du die funktion 2 mal auf?
außerdem ist $check immer gesetzt. das if ist also falsch


//edit:
was passiert, wenn sich mehrere user von einer ip anmelden wollen?
(z.b. uni, schule oder so)
warum benutzt du keine sessions?

BNightSpeeder am 29.10.06 17:52

@Snake:

Wurde behoben.

BNightSpeeder am 01.11.06 18:08

Update: Neue Variablen zum verändern des Aussehens.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt