Programmieren: PHP image captcha code

image capture code programmieren mit php

Hier möchte ich meine kleine aber feine capture code Lösung vorstellen, welche ich vor einiger Zeit mal programmiert habe. Ich war es leid, auch in Hinblick auf die DSGVO, Capture-Lösungen externer Anbieter einzubinden. Darüber hinaus werden durch diverse Privacy-Browser z.B. auch Javascripts geblockt, sodass ein externes Image-Capture-Modul für etwa das eigene Kontakt- oder Anmeldeformular nicht mehr funktioniert.

Eine eigene Lösung musste her, und die eines Image-Capture-Codes zum Schutz vor Spam mit PHP 7 oder 8 ist schnell und einfach programmiert. Verwendet wurde hier im Beispiel die Schriftart Yellowtail-Regular im OTF-Format (OpenType Font), dies hat aber keinen speziellen Grund. Solche OTF-Dateien kann PHP ab Version 7 mit imagefttext prima verarbeiten. Man kann sich für die gewünschte Schriftart eine entsprechende Datei überall im Internet herunterladen.

amz l music.jpg

php image capture code programmierenIch habe mich dazu entschieden ein paar zufällige Kreise in den Hintergrund des Captchas zu zeichnen, und die Buchstaben und Zahlen per Zufall jeweils leicht zu drehen, zu versetzen und leicht unterschiedlich einzufärben, um potentielle Bots davon abzuhalten, die Codes automatisiert lesen zu können.

Wem das nicht gefällt, kann es seinen wünschen natürlich entsprechend ändern und anpassen.

Inhaltsverzeichnis:

Schritt 1 - Zufällige Zeichenfolge (Code) generieren und in Datenbank abspeichern

Man benötigt im Prinzip 3 Funktionen, welche ich zusammen mit dem Verbindungsaufbau zur MySQL Datenbank in eine Klasse namens Database.php geschrieben habe.

//generiert einen zufälligen Code und schreibt diesen in die Datenbank.
function createCapture(){
$code = $this->getRandomCode(6, true);

$q = "INSERT INTO ".TABLE_CAPTURE." (code) VALUES ('".$code."')";
$this->query($q);
return $this->insert_id();
}

//lädt den entsprechenden Code anhand der zugewiesenen ID aus der Datenbank
function getCaptureCode($id){
$id = (int)$id;
$code = "";

$q = "SELECT code FROM ".TABLE_CAPTURE." WHERE Id='".$id."'";
$res = $this->query($q);
if ($data = $this->fetch($res)){
$code = $data['code'];
}
return $code;
}

//prüft ob der eingegebene Code mit der ID und dem entsprechenden Code aus der Datenbank übereinstimmt
function checkCaptureCode($id, $code){
$len = strlen($code);
if ($len<=0 || $len>8)
return false;

$valid = false;
$id = (int)$id;

$valid = ($this->getCaptureCode($id) == $code);
$this->query("DELETE FROM ".TABLE_CAPTURE." WHERE Id='".$id."'");
return $valid;
}

Schritt 2 - PHP-Script zum Generieren des Image Capture Codes in eine Bilddatei (PNG)

Den folgenden Code kann man einfach in eine neue PHP-Datei namens gen_capture.php kopieren. Die entsprechenden stellen im Code sind nur minimal kommentiert, sollten aber trotzdem leicht verständlich sein. Ggf. müsst ihr eure database.php includen, sofern diese nicht schon (global) irgendwo vorher geladen wurde.

<?php
global $database;
$id = (isset($_GET['id']) && is_numeric($_GET['id'])) ? (int)$_GET['id'] : 0;

//Load Code by ID
if ($id>0)
$code = $database->getCaptureCode($id);
else
$code = "1245678";

//define Font-File
$font_file = './Yellowtail-Regular.otf';
$font_size = 26;

//define Size of Capture Image
$width = 200;
$height = 100;

//Create Image
$im = imagecreatetruecolor($width, $height);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

//Create some random colors for background cycles
$color_mix = array();
for ($i=0; $i<strlen($code); $i++)
{
$color_mix[$i] = imagecolorallocate($im, mt_rand(0, 100), 0x00, mt_rand(100, 255));
}

//background black
imagefilledrectangle($im, 0, 0, $width-1, $height-1, $black);

//draw some random cycles
$x = 0;
$y = ($height/2);
$step_x = (int)($width/strlen($code));
for ($i=0; $i<5; $i++)
{
$size = mt_rand($font_size*2, $font_size*3);
imagefilledellipse($im, $x, $y, $size, $size, $color_mix[$i]);

$x += mt_rand($step_x*1.5, $step_x*2);
}

//draw the Code / char by char
$x = $font_size;
$y = ($height/2) + ($font_size/2);
for ($i=0; $i<strlen($code); $i++)
{
$angle = (mt_rand(0,1)==0) ? mt_rand(1, 30) : mt_rand(315, 359);
$text = substr($code, $i, 1);

imagefttext($im, $font_size, $angle, $x, $y, imagecolorallocate($im, mt_rand(150,255), 0x00, 0x00), $font_file, $text);

$x += mt_rand($font_size*0.8, $font_size*1.1);
}

//return image capture as png, cleanup and finish.
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

Schritt 3 - Image Capture Code in HTML-Formular einbinden

Im jeweiligen Formular auf eurer Seite (z.B. Kontaktformular) kann man das fertige Image-Capture-Modul nun einbinden. Hierzu ruft man die createCapture() Funktion auf, und erhält die entsprechende ID des Codes. Diese ID (capture_id) übergibt man zusammen mit der Eingabe des Benutzers (capture) und wertet diese nach abschicken des Formulares aus.

<?php $capture_id = $database->createCapture(); ?>
<img src="gen_capture.php?ìd=<?php echo $capture_id; ?>" width="200">
<input type="text" name="capture" placeholder="Enter Code">
<input type="hidden" name="capture_id" value="<?php echo $capture_id; ?>">

Danach kann man einfach prüfen ob die Eingabe des Benutzers korrekt war, indem man checkCaptureCode() aufruft. Hier wird der Code anhand der ID aus der Datenbank geladen und mit der Eingabe des Users verglichen.

$capture_id = (int)$_POST['capture_id'];
$capture = $database->filterInput($_POST['capture']);
if (!$database->checkCaptureCode($capture_id, $capture)){
$error = "&bull; ".ERROR_CAPTURE_CODE."<br>";
}

Das war es schon. Hoffe der Code ist verständlich, wovon ich jetzt einfach mal ausgehe. Feedback, Lob und konstruktive Kritik erwünscht! ;-)

amz l music.jpg

Author: Sascha von Saschas-Bastelstube.de

Autor: sascha

Ein paar Worte über mich selbst. Mein Name ist Sascha, wie der Titel dieses Blogs erahnen lässt. :-) Ich bin von Beruf selbstständiger Programmierer und Trader. Neben Programmierung, Trading und Kampfsport sind einige meiner Interessen und Hobbys das Kochen, Fitness und das Hören lauter Heavy-Metal Musik. :D

Dies könnte dich auch interessieren

iTunes-Connect - Sales-Reports

Wer Apple und iTunes-Connect (ITC) kennt, weiß von den Problemchen welche ITC teilweise mit sich bringt. Mich persönlich hat immer gestört, das die Sales-Reports / Verkaufszahlen des Vortages manchmal erst am späten Abend des Folgetages verfügbar waren. Das liegt wohl daran, das die Apple-Server die Reports für jeden Entwickler aufbereiten müssen und es hier öfter … „iTunes-Connect - Sales-Reports“ weiterlesen


WordPress-Installation anpassen für Datenschutz-Grundverordnung (DSGVO) 2018

Die EU-Datenschutz-Grundverordnung (DSGVO) tritt am 25. Mai 2018 in Kraft. Dabei gibt es unter anderem für Webseitenbetreiber allerhand zu beachten. Detailierte Informationen und Text-Muster für die eigene Datenschutzerklärung gibt es seit langem auf diversen Internetseiten wie z.B. bei Datenschutz.org , aber auch in entsprechenden Büchern zur Datenschutz Grundverordnung 2018 . Inhaltsverzeichnis:WordPress für Datenschutz-Grundverordnung (DSGVO) anpassenGoogle … „WordPress-Installation anpassen für Datenschutz-Grundverordnung (DSGVO) 2018“ weiterlesen


ESP8266-WiFi-Modul flashen

Da ich mich seit kurzem wieder intensiver mit den Themen Smart Home und "Home automation" beschäftige habe ich beschlossen einige meiner Baustellen, Stolpersteine und Lösungen hier zu veröffentlichen. Wie im Beitrag zu meinem Smart-Home-Project V1 bereits erwähnt setze ich auf das WLAN-Modul ESP8266-ESP01 , da dieses unter anderem klein, zuverlässig und günstig ist. In diesem … „ESP8266-WiFi-Modul flashen“ weiterlesen


Trading-Journal: Krypto Trading Bot für Kraken

Jeder halbwegs professionelle Trader sollte natürlich ein Trading-Journal führen um seine Trades zu erfassen und später auswerten zu können. Manche gute Trading-Software bietet natürlich bereits integrierte Lösungen an, was mich natürlich trotzdem nicht davon abgehalten hat für unser Projekt Smart-Trading-Systems.de eine eigene Software zu programmieren und diese an unser Trading-System anzubinden. Neben der Erfassung und … „Trading-Journal: Krypto Trading Bot für Kraken“ weiterlesen


DynDNS-Alternative im Eigenbau

Wer ohnehin über einen eigenen Webserver/Webspace im Internet und etwas Programmierkenntnisse verfügt, kann sich ohne großen Aufwand einen Service wie DynDNS.org & Co. sparen, will man auf Teile seines Heimnetzwerkes von Unterwegs aus zugreifen. Solche Services stellen einen Hostnamen/URL bereit (z.B. mein-heimnetzwerk.dyndns.org) welche dann auf die IP-Adresse des Heimnetzwerkes weitergeleitet wird. Neben einem oft kostenpflichtigem … „DynDNS-Alternative im Eigenbau“ weiterlesen