Auf die Notwendigkeit, Sonderzeichen aus einem String zu entfernen, stößt der C#-Programmierer des Öfteren. Umso unverständlicher, dass es keine systemnahe Funktion gibt, um Strings zu glätten oder eben bestimmte Sonderzeichen zu eliminieren.
Warum benötigen wir diese Funktion?
Die Anwendungsbeispiele sind vielfältig. Wenn Sie zum Beispiel einen FTP-Upload planen, dann sollten Sie den Dateinamen ohne Sonderzeichen sicherstellen. Auch wenn es oft keine Probleme bereitet, sollten Dateinamen prinzipiell ohne Sonderzeichen generiert werden.
Oder Sie planen, Benutzereingaben zu überprüfen. Ein Benutzername sollte auf jeden Fall ohne Sonderzeichen bestehen. Oder Sie möchten im Adresssatz Straße und Wohnort einer kurzen Überprüfung unterziehen. Dort haben Zeichen wie „$%& …“ nichts zu suchen. Auch der Name und Vorname kann auf diese Weise geprüft werden. Hier gilt aber zu beachten, dass Umlaute, eventuell auch französische oder skandinavische Sonderzeichen, möglich sein sollen. UTF-8 sei dank. Auch ein beliebter Fehler (und mir leider auch schon passiert): Das Hochkomma. Aus SQL-Sicht verbietet man das Hochkomma („’“) gerne, um den SQL-String nicht zu gefährden. Doch spätestens wenn man Herrn „O’Henry“ zum Datenbestand hinzufügen möchte, kommt man um die ordentliche Maskierung dieses und anderer Sonderzeichen nicht herum.
Um SQL-Injections zu verhindern, kann man beispielsweise in einer Benutzereingabe, die gegen die SQL-Datenbank geht, das Semikolon („;“) verhindern. Auf das Semikolon kann man in den allermeisten Fällen als Benutzereingabe verzichten und man erreicht dadurch, dass schon sehr vielen SQL-Angriffen den Grund und Boden entzogen wurde. Doch hier gilt: Das Verhindern der Semikolon-Eingabe ist nicht die alleinige Lösung. Das Semikolon MUSS auch noch – wie hier mit der folgenden Funktion – kurz vor der Datenbankabfrage geprüft werden. Auch wenn die Eingabefelder von C# meines Erachtens sehr sicher sind, schadet es nicht, Benutzereingaben auch noch mal in der zugrundeliegenden Programmvariablen zu prüfen. Im Web (PHP zum Beispiel) ist dies kein Rat, sondern der Verweis auf die Pflicht!
Noch abschließend der SQL-Injection-Hinweis, dass das Verhindern des Semikolons ein erster Schritt in die sichere SQL-Anwendung ist, doch damit ist das Thema leider noch nicht abschließend behandelt. Hier werde ich sicherlich noch einen weiteren Artikel schreiben.
Kommen wir nun endlich zum Listing Regex:
Listing1: Funktion gibt einen bereinigten String (Erlaubt sind nur 0-9, a-z, A-Z und einige Satzzeichen) zurück
public static String CheckString(String text) { return System.Text.RegularExpressions.Regex.Replace(text, @"[^0-9a-zA-Z .;.,_-]", string.Empty); }
Listing 2: Hier wird zusätzlich geprüft, ob per Regex der übergebene String sich verändert hat. Die Prüfung findet per „S“ (ein Zeichen, das kein Whitespace* ist), statt.
public static String CheckString(String text) { string sRes = System.Text.RegularExpressions.Regex.Replace(text, @"[^S ]", string.Empty); if (sRes != text) { Console.WriteLine("Text wurde geändert!"); } return sRes; }
* Whitespace (Leerraum): Steuerzeichen wie f, n, r, t und v