PHP-Funktion mysql_real_escape_string in C# umsetzen

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.

1 Gedanke zu „PHP-Funktion mysql_real_escape_string in C# umsetzen“

Schreibe einen Kommentar