SQL Injection



  • Hallo Forum,

    ich möchte SQL Stmnt über eine Schnittstelle abschicken das kein Klassensystem gegen SQL Injection anbietet. Gibt es irgend eine Möglichkeit die Klassen des SQL Servers zu benutzen?

    string strParameter = "a;DELETE * FROM X;--";
    string strSQL = "...WHERE Column1 = @MyValue";
    
    SqlCommand command = new SqlCommand(strSQL, null);
    
    //1:
    command.Parameters.Add(new SqlParameter("@MyValue", strParameter));
    //2:
    command.Parameters.Add("@MyValue", System.Data.SqlDbType.Text);
    command.Parameters["@MyValue"].Value = strParameter;
    //3:
    SqlParameter X = new SqlParameter("@MyValue", strParameter);
    
    // Result
    strSQLWhere = command.CommandText;
    

    Wie kann ich den bereinigten Parameter bekommen, oder zumindest eine Exception wenn der Parameter faul ist. Ich kann auch selber was basteln, hätte aber gerne eine vorgefertigte Lösung.

    Vielen Dank

    Peter



  • Welcher zweck hat die zweck:

    //3: 
    SqlParameter X = new SqlParameter("@MyValue", strParameter);
    

    ne exception kommt, wenn du die query ausführst, falls was nich stimmen sollte!`?



  • @NullBockException
    Welcher zweck hat die zweck?
    WTF?

    @abcd
    Ich verstehe was du willst (glaub ich zumindest). Kenne aber keine Klasse/Library die das kann.

    => Selbst schreiben?
    Ist ja nicht SO schwer.



  • Bei 3 habe ich ein SqlParameter Objekt erstellt und mit Schadcode-SQL befüllt, ich dachte ich könnte irgendwie den bereinigten Paramter bekommen.

    Ich habe mittlerweile selber eine Funktion geschrieben die die kritischen Zeichen herausfiltert.



  • Was passiert denn wenn du den Query ausführst? Denn theoretisch sollte der Query auch unabhängig von deiner Klasse zum Entfernen der bösen Stellen fehlschlagen.



  • Wenn die Parameter nicht bereinigt sind und ein solcher Code ausgeführt wird a';DELETE * FROM Customer;--, dann sind die Kunden weg. Es funktioniert zumindest bei einem Suchfeld (Textbox mit freier Eingabe).

    Ist aber jetzt egal, ich filtere alle Zeichen der Art heraus: ; ' " --
    Wenn ich Zeit habe, dann ersetze ich sie durch Tags und erstelle eine Übersetzungsfunktion. Semikolon wird als <1234> gespeichert und in der GUI wieder durch ein Semikolon ersetzt.



  • Wie kommst du eigentlich auf die Idee, dass man da irgendetwas filtern müsste?
    Lies einfach nach, wie man in diesem SQL-Dialekt Strings kodiert. Bastel nicht irgendeinen Quatsch, der scheinbar funktioniert.



  • abcd schrieb:

    Ist aber jetzt egal, ich filtere alle Zeichen der Art heraus: ; ' " --

    Du musst nur alle ' verdoppeln.

    Ein Ex-Kollege von mir dachte auch er sei schlau und müsse alle ' und '-ähnlichen Zeichen durch ´ ersetzen.
    Jetzt haben wir ne Datenbank voll mit so schönen Konstrukten wie "it´s" ... *schauder*.

    Und natürlich ist das nicht der einzige Nutzen von Parametern. Ist z.B. auch praktisch dass man Daten nicht speziell formatieren muss damit der SQL Server sie versteht. Ist aber auch keine Hexerei, eine passende "formatiere mir ein Datum für SQL" Funktion ist auch schnell geschrieben.

    @inflames2k
    Ja, stimmt schon, er hat in seinem Code den ' nach a vergessen.
    Aber grundsätzlich hat er schon Recht, das ist genau das Problem das bei SQL-Injection ausgenutzt wird.



  • Wenn du das so machst wie in deinem Beispiel bist du gegen SQL Injection sicher! Genau so sollte man die MYSQL-API nutzen.

    Grüße


Anmelden zum Antworten