PHP – Zufallszeichen für verschiedene Anwendungsgebiete
In diesem Workshop wird das erzeugen von Zufallszeichenketten und deren Verwendung erläutert. Die Beispiele können für die Passworterzeugung, das benennen von Dateien oder auch für die Spamabwehr in Formularen genutzt werden.
1. Zufallszeichenketten mit versch. Parametern erzeugen
Da man ja möglichst vielfältig verwendbaren Code schreiben soll, (Programmierer sollen faul sein? ) habe ich hier den Code in eine function multirandom verpackt. Diese kann mit mehreren Parametern aufgerufen werden.
- Art der verwendeten Zeichen
- minimale – maximale Zufallszeichenkettenlänge
- Verwendung eines Prefixes, nützlich um z.B. Dateien einem Benutzer zuzuordnen
Hier zunächste die komplette Routine zum Abruf der Zufallszeichen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // // Zufallskey erzeugen von unterschiedlicher laenge (x-y Zeichen) // Aufruf: $key = multirandom($art, $von, $bis, $prefix ); // Parameter: // $art = 1, 2 oder 3 == Buchstaben/Zahlen - GROSSBUCHSTABEN - nur Zahlen // $von - bis == Lange der Zeichenkette // $prefix == Vorangestellter Prefix, z.B. Userkennung (12_$key) OPTIONAL // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // function multirandom ($art = 1, $von = 5, $bis = 10, $prefix = '') { $keyrandlength = mt_rand($von,$bis); $keyarrayall = array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,R,S,T,U,V,W,Y,Z,a,b,c,d,e,f,g,h,j,k,m,n,p,q,r,s,t,u,v,w,y,z,1,2,3,4,5,6,7,8,9); $keyarraycha = array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,R,S,T,U,V,W,Y,Z); $keyarraynum = array(1,2,3,4,5,6,7,8,9); // Welches Array von Zeichen nutzen? // 1 = Buchstaben und Zahlen // 2 = Nur Grossbuchstaben // 3 = Nur Zahlen if($art == 1) { $usedarray = $keyarrayall; } elseif ($art == 2) { $usedarray = $keyarraycha; } else { $usedarray = $keyarraynum; } // Zufallszeichen ermitteln for($i = 0; $i < $keyrandlength; $i++) { shuffle($usedarray); $keydata .= $usedarray[1]; } // Prefix voranstellen? $returnkey = $prefix != '' ? $prefix . $keydata : $keydata; return $returnkey; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
Möglichkeiten der Benutzung
$zufall = multirandom(1, 10, 15, 'Name_');
Der obige Code produziert folgende Ausgabe
Name_OtcPmsDhFF3ZSap
Hier wurde der Parameter PREFIX mit dem Wert Name_ an die Routine gesendet, die Zeichenkettenlänge soll zwischen 10 und 15 Zeichen betragen und aus Buchstaben und Zahlen bestehen – bewirkt duch den Parameter 1.
$ufall = multirandom(3, 15, 15, '');
Dieser Aufruf erstellt eine 15 Zeichen lange Zufallszahl, z.B. 796699214581525
Möchte man eine Zufallszeichenkette gleich per MD5 verschlüsseln, nichts leicher als das…
$zufall = md5(multirandom(1, 15, 15, ''));
Beispielausgabe: c8afe087bac44ba1df1816a53e822819
Braucht man auf einen Schlag mehrere Zufallszeichenketten, einfach den Aufruf in einer Schleife benutzen.
for ($i = 0; $i <= 9; $i++) { $zufall = multirandom(1, 10, 25, ''); echo "$zufall<br>n"; }
Beispielausgabe:
PWZBk9saUs
cW6OMghkvsLjmkt3
UuK6wV416dAc
Kgwm19ZhhW8wSUyZOBd
OyNpRIkVKMwc5GFpJV1sFkd
TypFm5Pp5VZZmByIVIJbc
6vj8tC9W5d
FMVVYbCgRz2E4vg9t
f1cHcPLzYAHCmRAbpLI1z5d
9FP3krefPjIuPkMjTnS2Ow
2. Anwendung als Formularschutz (Captcha)
Dieses Beispiel nutzt die multirandom Routine um eine spezielle Art von Captcha für Formulare zu erzeugen. Warum das? Nun normale Captchas werden heute schon per OCR (Optische Zeichenerkennung) ausgelesen und somit überlistet.
Diese Variante geht einen anderen Weg, hier wird aus Einzelbildern eine Captcha Ausgabe erzeugt, dazu eine Auswahlliste mit verschiedenen Möglichkeiten, die Richtige auszuwählen schafft der Spambot fast nie.
Idealerweise sollte man, will man den Code benutzen, eine MySQL Datenbank zur Verfügung haben. Diese speichert dann die Daten der Routine und ermöglicht eine leichte Abfrage der gespeicherten Werte.
Hier zunächst die komplette Routine
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # // Erzeugen von Captcha Keys, Zufallsstring und Zeit fuer Formularspamabwehr // Aufruf: list($capgra,$auswahl, $keydata, $zeit, $okcap) = form_captcha('formcss', 6); // Parameter: // formcss = css Angabe fuer Select // 6 = Zeichenlaenge des Captchas, ideal zwischen 5 - 7 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # function form_captcha($css='', $zl = 6) { // Formularkey erstellen $keydata = multirandom(1, 30,60, ''); // Zufallszeichen ermitteln, Array erstellen $captcha = array(); for ($i = 0; $i <= 5; $i++) { $pushdata = multirandom(2, $zl, $zl, ''); array_push($captcha,$pushdata); } // Dies sind die Bildnamen die im Verzeichnis images/cappic liegen // als z.B. PTGHF.png. Wird ein anderes Bilderverzeichnis genutzt // Angabe etwas weiter unten bei <img src="images/cappic anpassen. // Es koennen auch eigene andere Sets von Captcha Grafiken erstellt // werden, einfach am vorgegebenen Beispiel orientieren. Wichtig ist // die zufaellige Bezeichnung um ein automatisiertes auslesen zu verhindern // durch die Spambots. $capkeys = array( A => "PTGHF", B => "FGBHH", C => "GUUBN", D => "ASWWR", E => "LMNKK", F => "OPZUR", G => "DVBNH", H => "KLBCT", I => "ERLMB", J => "YBMLU", K => "POUHN", L => "RGLDD", M => "TGHBD", N => "YBMUT", O => "JGFAS", P => "AXMBN", R => "RGLOP", S => "SHKTR", T => "HGFOP", U => "DOTTL", V => "MNKHF", W => "LJHWE", X => "POSWE", Y => "ZTBXA", Z => "CWELM" ); // Zufaellige Auswahl aus generierter Captcha Auswahl $rand_var = array_rand($captcha, 1); // Captcha String in Einzelzeichen zerlegen $zeichen = preg_split('//', $captcha[$rand_var], -1, PREG_SPLIT_NO_EMPTY); // Captcha Grafiken als IMG bereitstellen while(list($key, $val) = each($zeichen)) { $keygrafik .= "<img src=\"images/cappic/$capkeys[$val].png\" width=\"17\" height=\"19\" border=\"0\">"; } // Auswahlliste erstellen $captchaselect = "<select name=\"capout\" size=\"1\" class=\"$css\">n"; $captchaselect .= "<option value=\"\">Bitte Auswahl treffen</option>n"; foreach ($captcha as $buchst) { $teile = implode(' ', preg_split('//', $buchst, -1, PREG_SPLIT_NO_EMPTY)); $captchaselect .= "<option value=\"$buchst\">$teile</option>n"; } $captchaselect .= "</select>n"; return array($keygrafik, $captchaselect, md5($keydata), time(), $captcha[$rand_var]); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
Aufruf der Routine und Rückgabewerte
list($keygrafik, $captchaselect, $keydata, $zeit, $okcap) = form_captcha('css', 6);
Übergabewerte
- css = CSS Style Wert für die Auswahlliste
- 6 = Anzahl an Zeichen die erzeugt werden sollen
Rückgabewerte
- $keygrafik = Liste der Bilder die für die Captchaausgabe
- $captchaselect = Selectliste mit den Auswahlmöglichkeiten
- $keydata = Zufallszeichenkette als Formularkey
- $zeit = Erzeugungszeit der Daten als Unix Timestamp, nötig für ie Prüfung ob das Formular zu schnell gesendet wurde und auch zum löschen von alten Daten aus der Datenbanktabelle
- $okcap = der Captcha Wert der das erfolgreiche absenden ermöglicht
Ausgabebeispiel
Auf der nächsten Seite wird der Einbau dieser Captcha Prüfung in ein Formular erläutert.
3. Einbau des Captcha Codes in ein Formular
Dieses Beispiel setzt Kenntnisse im Umgang mit MySQL Datenbanken, Tabellen und Abfragen vorraus. Fragen hierzu können im Forum gestellt werden.
1. Das Formular wird aufgerufen
list($keygrafik, $captchaselect, $keydata, $zeit, $okcap) = form_captcha('css', 6);
- Die Daten für $keygrafik und $captchaselect werden direkt im Formular ausgegeben.
- $keydata wird als Formular Hidden Feld definiert (<input type=“hidden“ name=“formkey“ value=“$keydata“>)
- $keydata, $zeit und $okcap werden in die Datenbanktabelle gespeichert, siehe nachfolgenden Beispielcode.
INSERT INTO spamlogger (randkey, okcap, zeit) VALUES('$keydata', '$okcap', '$zeit')
2. Das Formular wird abgesendet
Hier wird der Wert des Hidden Feldes formkey genutzt um zu prüfen ob überhaupt hierfür Daten existieren in der MySQL DB, und ob eine korrekte Auswahl aus dem Captchaselect getroffen wurde.
SELECT randkey, okcap, zeit FROM spamlogger WHERE randkey = '$formkey'
Sind Daten vorhanden und der gespeicherte Wert für okcaptcha stimmt mit dem aus dem Formular überein kann das Formular gesendet werden. Zusätzlich kann man noch eine Prüfung der Formularversandzeit realisieren. Ist die Differenz der aktuellen Zeit und des gespeicherten Wertes z.B. unter 30 Sekunden kann man von (automatisiertem) Spam ausgehen. Wie dann darauf reagiert wird muss jeder selbst entscheiden. Mann kann eine Fehlermeldung ausgeben, oder aber man lässt das Formular nur den Mailversand überspringen. Denkbar ist auch eine Weiterleitung im Fehlerfall zu einem Loggingscript oder das Loggen der Fehlversuche erfolgt gleich beim Formularversand.
Sind alle Prüfungen abgeschlossen, die Mail gesendet (oder auch nicht, wenn Spam) wird der gerade verwendete Eintrag für den Formularkey wieder aus der DB gelöscht.
DELETE FROM spamlogger WHERE randkey = '$formkey'
Alte, ungenutzte Einträge der Formularkeys kann man mit einem Solchen SQL Query löschen.
DELETE FROM spamlogger WHERE ($aktueller_unixtimestamp - zeit) > 86400
Dies löscht alle Einträge die älter als einen Tag sind.
Weitere Beiträge
Meta Quest 3: Entdecken Sie das aktuelle VR-Headset
Die Meta Quest 3 ist das aktuelle Mixed-Reality-Headset von Meta, das innovative Technologien vereint, um ein einzigartiges VR-Erlebnis zu bieten. Diese VR-Brille stellt sowohl für Gelegenheitsnutzer als auch für Technikenthusiasten eine aufregende Möglichkeit dar, die Grenzen zwischen der physischen und digitalen Welt zu erkunden. Eine echte Alternative zur Apple Vison Pro. Wer etwas günstiger in […]
Amazon Prime Deal Days: Günstige Hardware-Angebote für Technikfans
Amazon bietet während der Prime Deal Days besonders günstige Hardware an. Das beliebte Shopping-Event läuft vom 8. bis 9. Oktober. Prime-Mitglieder dürfen sich auf exklusive Rabatte und Angebote freuen. Besonders Technikfans kommen in diesen zwei Tagen voll auf ihre Kosten.
Amazon-Vergleichstabellen erhöhen die Affiliate-Einnahmen
Amazon-Vergleichstabellen: Wer im Internet kaufen will, vergleicht zunächst Preise und Produkteigenschaften. Hier ist bei vielen Interessenten Amazon die erste Wahl. Gleichzeitig bietet der Branchenriese ein interessantes Partnerprogramm für Empfehlungen an. Wer sich damit ein zusätzliches Einkommen sichern möchte, bietet seinen Besuchern spezielle Amazon-Vergleichstabellen auf seiner Webseite an. So findet der Kunde schneller die relevanten Informationen […]
Amazon startet den 10. Prime Day am 16. und 17. Juli
Prime Day 2024: Vom 16. bis 17. Juli haben Prime-Mitglieder exklusiven Zugang zu einer Vielzahl von Angeboten in verschiedenen Kategorien wie Bekleidung, Elektronik, Küche & Haushalt und Spielzeug. Neue Deals werden während des gesamten Zeitraums veröffentlicht, um Prime-Mitgliedern am zehnten Prime Day stets etwas Neues zu bieten. Die ersten Angebote sind bereits verfügbar. Weitere Produkte […]
Keine Kommentare vorhanden