C# und MySQL .NETZ-Anschluss - keine Möglichkeit der Verhinderung von SQL-Injection-Angriffe in einer generischen Klasse?
Meine Idee ist, erstellen Sie einige generische Klassen für Insert/Update/Select über eine C# (3.5) Winforms app Unterhaltung mit einer MySQL-Datenbank via MySQL .NET-Anschluss 6.2.2.
Beispiel:
public void Insert(string strSQL)
{
if (this.OpenConnection() == true)
{
MySqlCommand cmd = new MySqlCommand(strSQL, connection);
cmd.ExecuteNonQuery();
this.CloseConnection();
}
}
Dann von überall im Programm kann ich eine Abfrage ausführen, mit/ohne Benutzereingabe, nur durch die übergabe eines SQL-Abfrage-string.
Lesen, um auf, SO ist ab zu geben mir den Hinweis, dass dies kann dazu führen, SQL-injection-Angriffe (für jede user-Eingabe-Werte). Ist es überhaupt schrubben die eingegebenen strSQL oder brauche ich zu gehen, und erstellen Sie einzelne parametrisierte Abfragen, in jeder Methode, die Bedürfnisse zu tun, eine Funktion in der Datenbank?
UPDATE1:
Meine Finale Lösung sieht wie folgt aus:
public void Insert(string strSQL,string[,] parameterValue)
{
if (this.OpenConnection() == true)
{
MySqlCommand cmd = new MySqlCommand(strSQL, connection);
for(int i =0;i< (parameterValue.Length / 2);i++)
{
cmd.Parameters.AddWithValue(parameterValue[i,0],parameterValue[i,1]);
}
cmd.ExecuteNonQuery();
this.CloseConnection();
}}
- Diese Schreie, schreckliche Idee. Sollten Sie ein ORM oder schreiben gespeicherte Prozeduren.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie auf jeden Fall mit parametrisierten Abfragen, um sich zu halten safe.
Du musst Sie nicht von hand erstellen Sie parametrisierte Abfragen jedes mal, wenn. Sie ändern könnte, die generische Methode Sie akzeptiert eine Sammlung von
MySqlParameters
:Sollte ich auch erwähnen, dass Sie sollten SEHR vorsichtig sein bei der Reinigung Ihrer verbindungen, nachdem Sie fertig sind mit Ihnen (in der Regel behandelt werden, in einen
using
block, aber ich sehe nicht, dass eine level-of-detail in deinem code-Beispiel).Parametrierung ist sehr einfach zu tun. Viel einfacher als das schrubben von SQL-Abfragen, und weniger chaotisch oder fehleranfällig als die manuelle entkommen.
Leicht bearbeitet copy/paste von diese tutorial-Seite, weil ich ' m Gefühl faul:
Dass es gar nicht so schwer, war es? 🙂
Es unmöglich zu erkennen SQL-injection-nach der Tat (in anderen Worten, Sie haben einmal konstruiert sich eine dynamische query-string, ist es unmöglich zu unterscheiden, was die "echten" SQL ist gegen jede eingefügte SQL).
Wenn Ihre Absicht ist es, Benutzern das ausführen beliebiger SQL, dann würde es scheinen, wie Sie würde nicht allzu besorgt über SQL-injection (denn das ist das Ziel, SQL-injection).
Ich würde erwarten, dass es wäre ziemlich schwer zu schrubben raw-text, der verwendet wird für SQL. Wenn möglich würde ich versuchen, auf der Verwendung von parametrisierten Operationen.
Eine Ausnahme wäre, wenn Sie didn ' T setzen Sie die Funktion öffentlich ist, und Sie nie, übergeben Sie eine Zeichenfolge, die gebaut wurde aus raw user input.
wenn Sie
MySqlParameter
und erzeugen nicht einfacher string Abfragen Sie sicher sind.Kann man nicht wirklich, dies zu tun - Sie müssten schreiben Sie einen SQL-parser, um das Mindeste zu sagen, ist nicht trivial und sehr fehleranfällig.
Den sauren Apfel beißen und parametrieren Sie Ihre Abfragen.
Ich würde vorschlagen, die Verwendung IDataParameter-Objekte zu parametrisieren Sie Ihre Abfragen.
JA, Sie müssen erstellen Sie parametrisierte Abfragen, alles andere bringt die Gefahr von SQL-injection -