 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Fragen stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
03.03.2008, 16:25
|
#1
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Klasse zum validieren von Formular-Benutzereingaben
Tach Dynamiker,
im Laufe der Zeit sammelt sich wohl jeder so einiges an Schnipsel zusammen, die man dann als Funktionen in seinen Projekten benutzt. Was man quasi bei jedem PHP-Projekt braucht ist eine Möglichkeit Benutzereingaben in Formularen zu validieren, um sich vor böswilligen Attacken zu schützen.
Aus diesem Grund habe ich mal meine eigene Validator Klasse zusammen gestellt, weil das bequemer ist als sich mit etlichen losen Funktionen herumzuplagen. Da ich mir dachte das einige von Euch sowas auch brauchen können, stelle ich die Klasse hier zur Verfügung.
Hier mal eine kurze Anwendungsbeispiel-Übersicht für die Klasse...
PHP-Code:
<?php
// Klasse einbinden
include( 'validator.class.php' );
// Validator Objekt erzeugen
$formular = new Validator();
/* --------------------------- */
/* --- Anwendungsbeispiele --- */
/* --------------------------- */
/**
* Zahlen - nur Ziffern werden als gültig erkannt
*
* Parameter: Wert, Feld-Bezeichnung
*/
$zahl = 123456789;
$formular->pruefeZahl( $zahl, 'Zahl' );
/**
* Postleitzahl - nur 5-stellige Zahlen werden als gültig erkannt
* 12345 = true
* 93746 = true
* 45x98 = false
* 123.4 = false
*
* Parameter: Wert, Feld-Bezeichnung
*/
$plz = 12345;
$formular->pruefePLZ( $plz, 'PLZ' );
/**
* Datum - nur ein gültiges Datum im deutschen Format wird als gültig erkannt
* 15.7.2004 = true ( Trennzeichen = . )
* 15-7-2004 = true ( Trennzeichen = - )
* 15/7/2004 = true ( Trennzeichen = / )
* 29.02.2008 = true
* 29.02.2007 = false
* 31.11.2008 = false
* 24 12 2008 = false
*
* Parameter: Wert, Feld-Bezeichnung, Trennzeichen
*/
$datum = '24.12.2008';
$formular->pruefeDatum( $datum, 'Datum', '.' );
/**
* Telefonnummer - Zahlen mit Telefonnummer-Struktur werden als gültig erkannt
* 0123 45678 = true
* +49 123 45678 = true
* (0) 123 45678 = true
* 0123 45 678 = true
* 0123 / 45678 = true
*
* Parameter: Wert, Feld-Bezeichnung
*/
$telefonnummer = '0123 / 45678';
$formular->pruefeTelefon( $telefonnummer, 'Telefonnummer' );
/**
* Geldbetrag - Nur Geldbetrag-Strukturen werden als gültig erkannt
* 399 = true
* 399,49 = true
* 1.399,00 = true
* 1.000.000 = true
* 1.234.567,89 = true
* 399,499 = false
* 23.45,99 = false
* 0399 = false
*
* Parameter: Wert, Feld-Bezeichnung
*/
$geldbetrag = '1.234.567,89';
$formular->pruefeGeldbetrag( $geldbetrag, 'Geldbetrag' );
/**
* Wort - nur einzelne Wörter bestehend aus Buchstaben werden als gültig erkannt
* Baumhaus = true
* Karl-Heinz = false
* Route66 = false
* Schreibtisch = false (FALSE wenn Maximallänge z.B. 10 Zeichen beträgt)
* CSS = false (FALSE wenn Mindestlänge z.B. 5 Zeichen beträgt)
*
* Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
* Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
*/
$wort = 'Audi';
$formular->pruefeWort( $wort, 'Automarke', 3, 20 );
/**
* Name - nur Wörter mit Namen-Struktur werden als gültig erkannt
* Max Mustermann = true
* Prof. Max Mustermann = true
* Mister O'Leary = true
* Karl-Heinz Schmitt = true
* Fritz Fischer 3. = false
* Klaus Kleister = false (FALSE wenn Maximallänge z.B. 10 Zeichen beträgt)
* Kalle = false (FALSE wenn Mindestlänge z.B. 7 Zeichen beträgt)
*
* Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
* Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
*/
$name = 'Prof. Dr. Max Mustermann';
$formular->pruefeName( $name, 'Benutzername', 5, 50 );
/**
* Text - normaler Text wird als gültig erkannt
*
* Parameter: Wert, Feld-Bezeichnung, Mindestlänge, Maximallänge
* Mindestlänge und Maximallänge haben als Default 999 und wird daher ignoriert
*/
$text = 'Hier steht belangloser Text der eeewig lang sein kann.';
$formular->pruefeText( $text, 'Nachricht', 15, 1500 );
/**
* Email-Adresse - Nur Email-Adressen werden als gültig erkannt
*
* Parameter: Wert, Feld-Bezeichnung
*/
$email = 'jemand@irgendwo.de';
$formular->pruefeEmail( $email, 'Email' );
/**
* Web-Adresse - Nur Web-Adressen werden als gültig erkannt
* http://www.domain.de = true
* www.domain.de = true
* https://www.domain.de = true
* http://domain.de = true
* www.domain.de/seite.htm = true
*
* Parameter: Wert, Feld-Bezeichnung
*/
$url = 'http://www.eine-domain.de';
$formular->pruefeURL( $url, 'URL' );
/**
* Abfrage ob Fehler aufgetreten sind und diese ggfs. ausgeben.
* getError() liefert ein Array zurück dessen Schlüssel den Feldnamen
* entspricht, die man bei den Methoden-Aufrufen übergeben hat.
* Der Wert enthält die Fehlermeldung, die in der Klasse gesetzt wurden.
* Natürlich kann man auch statt $fehler eigene Meldungen ausgeben.
*/
if (count( $formular->getError() ) > 0)
{
foreach ($formular->getError() as $feld => $fehler)
{
echo $feld. ': ' .$fehler. "<br />\n";
}
}
?>
Noch ein Hinweis:
Auf alle Werte die in die Klasse übergeben werden, wird eine allgemeine Routine ausgeführt. Die umfasst folgende Aktionen: - Stripslashes, wenn Magic Quotes auf dem Server aktiv ist
- Trim um Leerzeichen vor und nach dem Wert zu entfernen
- \r\n wird in \n umgewandelt
- Mehr als 3 Zeilenumbrüche werden auf einen neuen Absatz reduziert. (verhindert sinnlose gestreckte Texte)
- Mehr als 3 Leerzeichen werden auf 2 Leerzeichen reduziert (sinnlosen Whitespace braucht niemand)
- Übertriebe Zeichen-Wiederholungen werden gekürzt. (z.B. 20 Ausrufungszeichen werden auf 1 Ausrufungszeichen reduziert)
- Überlange Zeichenketten werden unterbrochen (verhindert das überlange Wörter das Layout sprengen)
- Potentielle SQL Injections werden blockiert. Dabei wird bei jedem Wert geprüft ob sich ein möglicher SQL Befehl eingeschlichen hat (z.B. drop table oder insert into, etc.)
- Potentielle Email Injections werden blockiert. Jeder Wert wird auf eventuelle Header Attacken geprüft. (ob z.B. bcc:, content-type:, etc. eingeschleust wurde)
- Alle RegEx benutzen das normale Alphabet a-z, A-Z und Umlaute, sowie einige wenige Sonderzeichen und französische Akzentzeichen (es soll ja auch Leute geben die z.B. René heissen
)
Die verwendeten Regulären Ausdrücke haben bisher gut funktioniert, auch wenn sie nicht allzu "scharf" sind. Wer Verbesserungsvorschläge hat oder einen Schnitzer entdeckt hat, immer her damit - am besten direkt mit einer Lösung/Verbesserung.
Viel Spaß beim validieren!
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
.
|
|
|
29.05.2008, 13:18
|
#2
|
|
TP-Veteran
Registriert seit: May 2006
|
Ich will ja nicht reinreden, aber wäre es nicht besser, für jede Validierung eine eigene Klasse zu schreiben, die ein Interface implementiert? Dann ist das ganze variabler und man muss nicht die Kernklasse anfassen.
Dann könnte man den eigentlichen Validator instanziieren und beliebig viele Regeln (ergo Klassen) hinzufügen. So in der Richtung:
PHP-Code:
$validator = new Validator(); $validator->addRule('...Regel 1...'); $validator->addRule('...Regel 2...'); $validator->addRule('...Regel 3...');
Die Regeln sind dann die Klassen, die in Dateien liegen, die genauso heißen wie die Klassen selber.
EDIT: Ich habe gerade gesehen, dass manuelito unten das etwa so gebaut hat, wie ich meinte..
__________________
...Meine Meinung
1984
Geändert von marc22 (29.05.2008 um 13:27 Uhr).
|
|
|
29.05.2008, 13:49
|
#3
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Ich will ja nicht reinreden, aber Danke!
Ich hab zwar da so meine eigenen Schnippsel, aber ich finde es Klasse von Dir, so etwas hier hinzustellen! Und da ich Dich nicht bewerten, weil ich erst ein paar andere bewerten, mache ich es auf diesem Weg 
|
|
|
29.05.2008, 15:27
|
#4
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
@ marc22
Jeder wie er mag; bekanntlich führen viele Wege nach Rom.
Für kleinere Projekte fange ich persönlich nicht großartig an mit Interfaces und etlichen Klassen zu hantieren, wenn ich alles was ich benötige gebündelt in einer Klasse haben kann.
@ Cybergreek

__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
.
|
|
|
29.05.2008, 15:45
|
#5
|
|
TP-Veteran
Registriert seit: May 2006
|
Na klar. Ist mir nur vorhin so durch den Kopf gegangen, als ich mir das anschaute. 
__________________
...Meine Meinung
1984
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 10:44 Uhr.
|
 |