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! ;-)

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

3 Gründe warum es App-Entwickler nicht einfach haben

Aus gegebenem Anlass heute mal ein kleiner Beitrag aus der Sektion "Nicht ganz so ernst gemeinte Beiträge". Hier nun einige Überlegungen warum es App-Entwickler heute schwieriger haben, als noch vor einigen Jahren. Eines vorweg: Wer in diesem Beitrag einen Hauch von Ironie und Sarkasmus findet, darf ihn behalten! ;-) Inhaltsverzeichnis:Problem 1: Die Masse an Apps … „3 Gründe warum es App-Entwickler nicht einfach haben“ weiterlesen


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


Experiment: Hacking Ethereum Wallets - Bruteforce

Vor einiger Zeit bin ich durch Zufall auf ein Youtube-Video gestoßen mit dem Titel: "Eth Wallet Bruteforce Hack". Ein Programmierer zeigte da ein einfaches Python Script welches einen zufälligen Private-Key (64 Zeichen / 32 Byte / 256 Bit) generieren konnte. Daraus wurde Public-Key und Adresse errechnet und an einen Blockchain-Explorer-Webseite wie Etherscan.io übergeben ob diese … „Experiment: Hacking Ethereum Wallets - Bruteforce“ weiterlesen


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


iOS-Android-Converter

Lange Zeit habe ich bei neuen App-Projekten zunächst die Sprachdateien / Language-Files für iOS geschrieben, und diese dann für die Android-Version händisch umgeschrieben. Das war vom Aufwand her immer schnell gemacht solange die Anzahl der implementierten Sprachen und der Umfang der Textbausteine niedrig war. Abgesehen vom Zeitaufwand ist das ganz schön langweilige und stumpfe Arbeit, … „iOS-Android-Converter“ weiterlesen