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

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


Privacy Browser für mehr Sicherheit und Privatsphäre

Mehr Datenschutz, Sicherheit und vor allem mehr Privatsphäre im Internet wird von allen Seiten gefordert, und das nicht erst nach dem Inkrafttreten der EU-weiten Datenschutz-Grundverordnung (DSGVO / Datenschutz ). Generell kann man diesen Wunsch durchaus nachvollziehen, denn wer möchte schon freiwillig großen IT-Konzernen erlauben die eigenen Daten weiterzugeben, zu verkaufen und wer weiß was damit … „Privacy Browser für mehr Sicherheit und Privatsphäre“ weiterlesen


Screen Recorder / Capture Software selber programmieren

Auf der Suche nach einem einfach zu bedienenen Screen-Recorder-Tool bin ich über allerhand kostenloser sowie kostenpflichtiger Softwarelösungen gestolpert. Aus meiner Sicht waren ziemlich alle entweder völlig überladen oder auch schlecht bzw. kompliziert zu bedienen. Andere waren auch einfach nur teuer im Verhältnis zum Funktionsumfang. Mein Fazit: Selber programmieren! Inhaltsverzeichnis:Screen-Recorder-Tool selber programmierenSchritt 1 - FFMPEG.NET Library … „Screen Recorder / Capture Software selber programmieren“ 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


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