Da C# leider die wichtige PHP-Funktion mysql_real_escape_string nicht anbietet, sind wir auf der Suche nach einer Lösung in C#. Im Artikel „C# Hochkomma maskieren für SQL-Statements (SQL-Escape)“ haben wir bereits einige Möglichkeiten untersucht, doch so richtig begeistert sind wir von keiner Lösung. Unser Ziel ist nach wie vor eine direkte Umsetzung von mysql_real_escape_string nach C#, wobei es unerheblich ist, ob der Ziel-SQL Server MySQL oder M$-SQL spricht. Möglich ist dies durch eine Regular-Expression.
So können wir mittels einem Regex.Replace einfache und doppelte Hochkommas, den Backslash sowie die Steuerzeichen r, n, x00, x1a einfach und sicher maskieren:
Regex.Replace(sValue, @"[rnx00x1a\'""]", @"$0");
Die unten beschriebene Funktion SQLEscape liefert den SQL-konformen und maskierten Wert zurück, so dass es beim Absetzen des SQL-Statements zu keinen Fehlern mehr kommen sollte.
Wichtig für die Nutzung ist die Einbindung der Regex-Klasse per „using System.Text.RegularExpressions;”
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string sBuffer = ""; sBuffer = "SELECT bla FROM table WHERE name ='O'Henry'"; Console.WriteLine(SQLEscape(sBuffer)); sBuffer = "SELECT bla FROM table WHERE name ='O''Henry'"; Console.WriteLine(SQLEscape(sBuffer)); //Warte Console.ReadLine(); } public static string SQLEscape(string sValue) { // SQL Encoding: r, n, x00, x1a, Backslash, einfache und doppelte Hochkommas if (sValue == null) return null; else return Regex.Replace(sValue, @"[rnx00x1a\'""]", @"$0"); } } }
C# mit MySQL: MySQL Query Escape
Die folgende Möglichkeit ist noch einfacher, meines Erachtens noch sicherer und funktioniert nur mit MySQL. Microsoft-SQL-Nutzer bleiben bei dieser Lösung leider außen vor.
Wenn man unter .NET eine MySQL-Datenbank ansprechen möchte, benötigt man einen enstprechenden MySQL-Connector. So ist es möglich, unter .NET sogenannte „Query-Parameter“ zu nutzen. Der folgende Code ist für C#-Benutzer sicherlich selbsterklärend. Es sei hinzugefügt, dass durch die Nutzung der Query Parameters keine Maskierung von Hochkommas mehr notwendig ist.
// Problematische Benutzer-Eingabe: Hochkomma string sBenutzername = "Meine Usereingabe: O'Henry"; // eine oder mehrere Parameter hinzufügen sql.command.Parameters.AddWithValue("?Username", sBenutzername); sql.command.CommandText= "SELECT id, pw FROM ‘users’ WHERE ‘username’=?UserName Limit 1";
Über diesen Weg können auch Stored Procedures angesprochen werden. Eine gute Zusammenfassung der Parameter gibt es auf der devart.com-Seite.
Ich habe die Funktion SQLEscape implementiert.
Bei folgendem String funktionierts nicht : vor ‚Eingangstür Haus K
Woran liegts?