|
|
|
RegEx:
Verwendung von regulären Ausdrücken
|
Mit regulären Ausdrücken Formulareingaben filtern
Beinahe gleich, um welche Script- oder Programmiersprache
es sich auch immer handeln mag, wer sich ernsthaft mit dem Erlernen einer
Programmiersprache beschäftigen möchte, wird früher oder später nicht um die
Verwendung von regulären Ausdrücken herum kommen. Beim Einstieg in PHP sieht die
Angelegenheit nicht anders aus. Bereits beim ersten, gegen unlautere Eingaben
abzusichernden Formular, kommt ein Programmierer mit der Nutzung von Filterfunktionen und
regulären Ausdrücken in Berührung.
Der einzige Ausweg, der einem unerfahrenen Programmierer anfänglich noch verbleiben
würde, insofern er sich nicht gleich mit der Syntax von regulären Ausdrücken belasten
möchte, wäre die Möglichkeit im Internet nach einem passenden Code-Schnipsel zu suchen.
Findet er einen geeigneten Code-Schnipsel, könnte er diesen kopieren und ins eigene
Listing übernehmen. Doch Vorsicht! Mit dem Kopieren verhält es sich wie mit dem
Abschreiben in der Schule, da durch eigene Unwissenheit schnell kleinere oder größere
Fehler mit übernommen und im ungünstigsten Fall durch diese Vorgehensweise größere
Sicherheitslücken geschaffen werden.
Nachfolgend ein Beispiel für einen einst gefertigten, voll funktionsfähigen
Code-Schnipsel, bei dem dennoch die Syntax nicht stimmt. Gedacht war dieser Schnipsel
ursprünglich zur Absicherung von Formularen. Mit Hilfe der PHP-Funktion preg_replace()
sollte aus den übermittelten Formulareingaben alle unerwünschten Zeichen ausgefiltert
und nur Buchstaben einschließlich Umlauten, Ziffern und typische Satzzeichen
durchgelassen werden.
Ein voll funktionfähiges Beispiel mit fehlerhafter Syntax:
<?php
$eing = "Ein {Teststring: Version/1.0} + ein weiteres Wort?!";
$ausg = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9\.,:;\-\!\?\+]/"," ",$eing);
echo "Ausgabe: ".$ausg."\n";
// Ausgabe: Ein Teststring: Version 1.0 + ein weiteres Wort?!
?>
Die Fehler sind in diesem kleinen Exempel noch relativ
harmlos, doch wo liegen diese Fehler? Im Beispiel werden innerhalb einer mit eckigen
Klammer eingefassten Zeichenauswahl mehr "vermeintliche" Metazeichen mit einem
Backslash maskiert, als es in einer benutzerdefinierten [Zeichenklasse] gibt. Weiterhin
wurde die Position des Minuszeichens unpassend gewählt.
Dazu sollte ein Coder wissen, dass außer dem \ Backslash, dem ^ Hütchenzeichen (Zirkumflex),
dem - Minuszeichen und der schließenden eckigen ] Klammer alle sonstigen Zeichen keine
Bedeutung als Metazeichen innerhalb einer Zeichenklasse besitzen. So steht zum Beispiel
ein unmaskierter Punkt in einem regulären Ausdruck für ein beliebiges Zeichen. Innerhalb
einer Zeichenklasse ist hingegen ein Punkt nur ein Punkt und kein Metazeichen und braucht
somit nicht durch einen Backslash als Escape-Sequenz maskiert zu werden. Einzig dem
Umstand, dass PHP unnütze Maskierungen von "normalen" Zeichen ignoriert bzw.
die Zeichen innerhalb einer Escape-Sequenz als "normal" behandelt, ist es zu
verdanken, dass die Funktion preg_replace() im obigen Beispiel wie erwartet ihre Arbeit
verrichtet.
Ferner sollte bedacht werden, dass sich mehrere kleine Schnitzer schnell zu einem
größeren Fehler summieren können. Um bei dem gewählten Beispiel zu bleiben, ein
Minuszeichen, welches innerhalb einer Zeichenklasse zwischen einzelnen Zeichen steht, wird
von PHP nicht als Minuszeichen gewertet, sondern als Kennzeichen für einen von bis
Bereich. Vom A-Z Bereich haben wir noch eine klare Vorstellung von den in diesem Bereich
enthaltenen Zeichen. Doch welche Zeichen befinden sich in einem unbewusst gewählten
Bereich? Wird das Minuszeichen hingegen an den Anfang oder an das Ende einer Zeichenklasse
eingefügt, kann es keinen Bereich mehr kennzeichnen und wird als einzelnes Zeichen
ausgewertet.
Nachfolgend das obige, jedoch von überflüssigen Escapezeichen
(Backslash)
bereinigte Beispiel:
<?php
$eingabe = "Ein {Teststring: Version/1.0} + ein weiteres Wort?!";
$ausgabe = preg_replace("/[^a-zA-ZäöüÄÖÜß0-9.,:;!?+-]/"," ",$eingabe);
echo "Ausgabe: ".$ausgabe."\n";
// Ausgabe: Ein Teststring: Version 1.0 + ein weiteres Wort?!
?>
Wie die Gegenüberstellung der beiden Exempel zeigte, ist
nicht nur das Erlernen einer Script- oder Programmiersprache wichtig, um sichere
Anwendungen zu programmieren, sondern ein Programmierer sollte reguläre Ausdrücke und
deren Syntax zumindest verstehen. Doch was sind eigentlich reguläre Ausdrücke?
Was sind reguläre Ausdrücke?
Bei regulären Ausdrücken handelt es sich um Suchmuster,
die geeignet sind Zeichenketten nach vorgegebenen oder vom Benutzer frei definierten
Kriterien zu durchsuchen. Die Kurzform RegEx, ebenso die deutsche Bezeichnung für einen
regulären Ausdruck, leiten sich dabei von der englischen Bezeichnung Regular Expression
ab. Je nach dem beabsichtigten Ergebnis, können die Suchmuster recht komplex Formen
annehmen und umfangreiche Veränderungen von Zeichenketten (Strings)
ermöglichen.
So wurde in den bisherigen Beispielen nicht nach Buchstaben oder Zahlen gesucht, da durch
einen Zirkumflex am Anfang der Zeichenklasse (Character Class) alle Buchstaben
des lateinischen Alphabetes sowie europäische Ziffern des Dezimalsystems und einige
Satzzeichen negiert wurden. Vielmehr wurde nach allen Zeichen gesucht, die nicht in der
definierten Zeichenklasse aufgeführt sind, um diese durch ein Zeichen oder eine
Zeichenkette zwischen " " zu ersetzen, im Beispiel durch ein Leerzeichen (Whitespace)
" ".
Je nach der verwendeten Script- oder Programmiersprache gibt es unterschiedliche
Implementierungen in Form von Programm-Bibliotheken, in den die erforderlichen Funktionen
enthalten sind. So ist in PHP ist eine PCRE-Bibliothek enthalten. Das Kürzel PCRE steht
dabei für die englische Bezeichnung Perl Compatible Regular Expressions. Bis zur PHP
Version kleiner 5.3 wurde auch noch POSIX Regex unterstützt, gilt jedoch seither als
veraltet.
Die Verwendungsmöglichkeiten und die Komplexität von regulären Ausdrücken beginnen bei
einfachsten Anwendungen und Suchmustern, wie der Suche nach einzelnen Zeichen, Silben oder
Worten in einer Zeichenkette. Reguläre Ausdrücke können aber auch für aufwendige
Suchvorgänge genutzt werden und in diesen Fällen oftmals umfangreiche Suchmuster
erforderlich machen. Den Einsatzmöglichkeiten werden praktisch nur Grenzen durch die
jeweilige Programmiersprache und durch die jeweils zur Verfügung stehende Rechenleistung
gesetzt. |
|
Finden und
gefunden werden ...
Autoritäten im
Internet
Die Kehrseite
Das Wesen
Zukunftsaussichten
Studien & Strategien
Verbreitung &
Bedeutung
Internet & Medien
- Optimierung -
Einstieg Optimierung
Erfolg oder
Misserfolg
Übersicht
Einführung ins Thema
Amazon Web
Service
Request und Response
Anfragen und Anträge
Weitere Beispiele
Einfaches Script - Unicode
Einfaches Script - ISO
Weitere Einzelheiten
Images/Bilder
prüfen
Einbinden von Dateien
User Agent senden
XML
Auslesen von Attributen
Auslesen mit Children
Ansprechen mit XPath
|