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.

uhrcenter.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

Projekt: pi_robot - Raspberry Pi, iPad und etwas Code

Der Raspberry Pi ist nach wie vor einer der beliebtesten Mini-Computer, nicht nur unter Bastlern. Kostengünstig (je nach Modell um die 30 bis 40,- EUR), flexibel im Anwendungsbereich und spätestens seit dem Raspberry Pi 3 auch mit ausreichend CPU-Leistung und Arbeitsspeicher ausgestattet, um auch etwas komplexere Aufgaben zu lösen. Mit dem 1,2 GHz quad-core ARM … „Projekt: pi_robot - Raspberry Pi, iPad und etwas Code“ weiterlesen


Color-Calculator / Farbrechner

Der Color-Calculator errechnet aus Hex-Farbwerten die entsprechenden Dezimal- und Float-Werte. So kann man Beispielsweise schnell und einfach Farbewerte aus dem Web für seine iOS-App übernehmen, ohne manuell umrechnen zu müssen. Für alle Tippfaulen unter euch (zu denen ich mich im übrigen auch zähle ;-) ) wird der passende Objective-C Programmcode generiert. Die Eingabe von ganzen … „Color-Calculator / Farbrechner“ 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


Passwort-Generator

Wer kennt es nicht, man benötigt ein neues Passwort, und es fällt einem nichts ein. Zumindest nichts, was man nicht schon in der Vergangenheit in irgend einer Form bereits benutzt hätte. Heutzutage ist es auch nicht mehr einfach mit einem Passwort ala "liebe123" oder "lassmichrein" getan. Gerade Server-Administratoren aber auch Privat-Personen sollten mehr Wert auf … „Passwort-Generator“ 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