Frage Datenbank in C # und SQL Injection erstellen


Ich habe den folgenden Code verwendet, um einige Datenbank von C # -Anwendung zu erstellen

SqlConnection myConnection = new SqlConnection(ConnectionString);
string myQuery = "CREATE DATABASE " + tbxDatabase.Text; //read from textbox
myConnection.Open();
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();

Jetzt mache ich mir Sorgen, ob es sicher ist, wird C # Hacker-Eingaben wie "A; DROP TABLE B" oder ähnliches akzeptieren? Wie kann man es sicherer machen?


5
2018-02-26 15:06


Ursprung


Antworten:


Tabellennamen und Spaltennamen können nicht parametrisiert werden, aber für die erste Verteidigungslinie den Tabellennamen mit einem Trennzeichen wie geschweiften Klammern umbrechen.

string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";

oder erstellen Sie eine Benutzerdefinitionsfunktion, die nach dem Wert der Eingabe sucht, z

private bool IsValid(string tableName)
{
    // your pseudocode
    // return somthing
}

dann auf deinen Code,

if (IsValid(tbxDatabase.Text))
{
    SqlConnection myConnection = new SqlConnection(ConnectionString);
    string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";
    myConnection.Open();
    SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
    myCommand.ExecuteNonQuery();
}
else
{
    // invalid name
}

4
2018-02-26 15:08



Ja, Ihr Code ist sehr unsicher, eine Alternative besteht darin, gespeicherte Prozeduren zu erstellen, die nur die genauen Parameter akzeptieren, um zu vermeiden, dass Befehle im laufenden Betrieb erstellt werden.

C # selbst wird nicht helfen, diese Dinge zu vermeiden, sollte es in der Anwendungslogik eingebettet werden


1
2018-02-26 15:10



Verwenden Sie Stored Procedure und übergeben Sie Parameter


1
2018-02-26 15:12



Setzen Sie den eigentlichen Erstellungsbefehl in eine gespeicherte Prozedur.

Kleben Sie den Text NICHT einfach aus einer Textbox in eine Zeichenkette und führen Sie ihn aus.

BEARBEITEN: Okay, es stellt sich heraus, dass CREATE einen konstanten Ausdruck benötigt, so dass Sie den Befehl nicht parametrisieren können.

Wenn Sie dies jedoch im Code tun müssen, sollten Sie die Eingabe zumindest validieren, bevor Sie sie in eine Zeichenfolge verketten. In diesem Fall sollten Sie keine Tabellennamen zulassen, die etwas anderes als a - z, A - Z enthalten.


0
2018-02-26 15:09



Der sichere Weg, dies zu erreichen, besteht darin, die SQL-Funktion QUOTENAME () zu verwenden, um die Eingabe zu umgehen.

CREATE PROC example_create_db ( @db_name NVARCHAR(256) )
AS 
    BEGIN
        DECLARE @sql NVARCHAR(1000)
    /*
        QUOTENAME() adds the surrounding []'s
    */

        SET @sql = 'CREATE DATABASE ' + QUOTENAME(@db_name) 
        EXEC sp_executesql
    END

0
2018-02-26 16:23