Skip to main content

Alles für die Homepage... Scripte, Templates, Workshops und Support

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.

  1. Art der verwendeten Zeichen
  2. minimale – maximale Zufallszeichenkettenlänge
  3. Verwendung eines Prefixes, nützlich um z.B. Dateien einem Benutzer zuzuordnen

Hier zunächste die komplette Routine zum Abruf der Zufallszeichen

CODE:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //
// 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

CODE:
$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.

CODE:
$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…

CODE:
$zufall = md5(multirandom(1, 15, 15, ''));

Beispielausgabe: c8afe087bac44ba1df1816a53e822819

Braucht man auf einen Schlag mehrere Zufallszeichenketten, einfach den Aufruf in einer Schleife benutzen.

CODE:
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

CODE:
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
// 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

CODE:
list($keygrafik, $captchaselect, $keydata, $zeit, $okcap) = form_captcha('css', 6);

Übergabewerte

  1. css = CSS Style Wert für die Auswahlliste
  2. 6 = Anzahl an Zeichen die erzeugt werden sollen

Rückgabewerte

  1. $keygrafik = Liste der Bilder die für die Captchaausgabe
  2. $captchaselect = Selectliste mit den Auswahlmöglichkeiten
  3. $keydata = Zufallszeichenkette als Formularkey
  4. $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
  5. $okcap = der Captcha Wert der das erfolgreiche absenden ermöglicht

Ausgabebeispiel

xx

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

CODE:
list($keygrafik, $captchaselect, $keydata, $zeit, $okcap) = form_captcha('css', 6);
  1. Die Daten für $keygrafik und $captchaselect werden direkt im Formular ausgegeben.
  2. $keydata wird als Formular Hidden Feld definiert (<input type=“hidden“ name=“formkey“ value=“$keydata“>)
  3. $keydata, $zeit und $okcap werden in die Datenbanktabelle gespeichert, siehe nachfolgenden Beispielcode.
CODE:
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.

CODE:
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.

CODE:
DELETE FROM spamlogger WHERE randkey = '$formkey'

Alte, ungenutzte Einträge der Formularkeys kann man mit einem Solchen SQL Query löschen.

CODE:
DELETE FROM spamlogger WHERE ($aktueller_unixtimestamp - zeit) > 86400

Dies löscht alle Einträge die älter als einen Tag sind.

Anzeige


Ähnliche Beiträge



Keine Kommentare vorhanden


Du hast eine Frage oder eine Meinung zum Artikel? Teile sie mit uns!

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *