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.

kraken l.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

This might also be interesting for you

Fitnessboard v1 - DIYS

Am Wochenende hatte ich glücklicherweise mal wieder etwas Zeit zum Basteln und dazu noch eine ganz nette Idee für ein Fitness-Board für das Training zuhause, welches aus der Liegestütz-Position bedient wird. Ein Video dazu gibt es weiter unten in diesem Artikel und im Youtube-Channel von tedokai.de. Jeder der Zuhause dann und wann Sport betreibt kennt … „Fitnessboard v1 - DIYS“ 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


Trainingsgerät: Makiwara 2.0

Ein Makiwara ist ein aus Japan stammendes Sportgerät, welches man im Karate vor allem als Schlagpfosten aus Holz kennt. Früher (und zum Teil heute noch) fertigt man einen Makiwara aus einem biegsamen und nicht-splitternden Holzbrett. Das eine Ende des Brettes wird senkrecht in den Boden getrieben, und das andere Ende im oberen Bereich (ca. 10-20cm) … „Trainingsgerät: Makiwara 2.0“ weiterlesen


Telegram Messenger und die Bot API - Teil 2

Im ersten Teil - Telegram Messenger und die Bot API - bin ich auf einige Grundlagen eingegangen wie man einen Telegram-Bot einrichtet und diesen nutzt um sich Nachrichten, Informationen und sonstiges bequem auf sein Handy zu schicken. Da sich dieses Werkzeug als äußerst praktisch erwiesen hat, habe ich mich dazu entschlossen den vorherigen Beitrag nochmal … „Telegram Messenger und die Bot API - Teil 2“ weiterlesen