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?