Frage

Nehmen wir an MySQL-Datenbank (wenn es darauf ankommt).

War es hilfreich?

Lösung

Nein, Sie werden nicht völlig sicher sein. Wie andere erwähnt haben, sind parametrisierte Abfragen immer der Weg zu gehen -. Egal, wie sind Sie auf die Datenbank zugreifen

Es ist ein bisschen eine urbane Legende, die mit Procs Sie sicher sind. Ich denke, der Grund, warum Menschen unter dieser Täuschung ist, weil die meisten Menschen gehen davon aus, dass Sie die Procs mit parametrisierte Abfragen aus dem Code aufrufen werden. Aber wenn Sie das nicht tun, wenn Sie zum Beispiel so etwas wie die unten tun, sind Sie weit offen:

SqlCommand cmd = new SqlCommand("exec @myProc " + paramValue, con);
cmd.ExecuteNonQuery();

Weil Sie ungefilterte Inhalte aus dem Endbenutzer verwenden. Wieder einmal alles, was sie tun müssen, ist die Linie beenden ( „;“), fügen Sie ihre gefährlichen Befehle und Boom - Sie abgespritzt sind.

(Nebenbei, wenn Sie im Web sind, nehmen Sie nicht ungefiltert Junk aus dem Query-String des Browsers -., Dass es absurd einfach zu tun, extrem schlechte Dinge, um Ihre Daten macht)

Wenn Sie die Abfragen parametrieren, sind Sie in einer viel besseren Form. Jedoch, wie andere hier schon erwähnt haben, wenn Ihr proc noch dynamischen SQL generiert und ausgeführt wird, gibt es immer noch Probleme sein kann.

Ich sollte anmerken, dass ich bin nicht anti-proc. Procs können mit den Datenzugriff für die Lösung bestimmter Probleme sehr hilfreich sein. Aber Procs sind nicht ein „Königsweg Lösung für SQL-Injektionen.

Andere Tipps

Sie sind nur immun gegen SQL-Injections, wenn Sie consistenly parametrisierte Abfragen verwenden. Sie sind fast immun gegen SQL-Injektionen, wenn Sie überall ordnungsgemäße Verwendung zu entkommen (aber es kann sein, und waren, Fehler in den Flucht-Routinen, so dass es als Parameter nicht so narrensicher ist).

Wenn Sie eine gespeicherte Prozedur aufrufen, und fügte hinzu, die Argumente durch Verkettung, ich kann immer noch eine zufällige Abfrage am Ende eines der Eingabefelder hinzufügen - zum Beispiel, wenn Sie CALL-CheckLogin @username haben = ‚$ username‘, @ '$ password', mit dem $ -things darstellt direkt verketteten Variablen Passwort =, nichts hält mich das $ Passwort Variable ändert zu lesen "'; DROP DATABASE, -".

Selbstverständlich, wenn Sie die Eingabe vorher aufzuräumen, dies trägt auch SQL-Injection zu verhindern, aber dies kann möglicherweise Daten herauszufiltern, die nicht gereinigt werden sollte.

Es hängt davon ab, was Ihre gespeicherten Procs tun. Wenn sie dynamisch SQL erzeugen auf der Basis ihrer Parameter und dann die SQL ausführen, dann bist du immer noch anfällig. Ansonsten sind Sie viel eher in Ordnung zu sein - aber ich zögere, 100% sicher klingen

!

Nö. Wenn Sie SQL sind erstellt, die eine gespeicherte Prozedur aufruft, sind Sie immer noch ein Ziel.

Sie sollten parametrisierten Abfragen auf der Client-Seite werden zu schaffen.

Nein, wie Sie noch D-SQL in gespeicherten Prozeduren verwenden könnte ... und Validierung und beschränken Sie Ihre Eingabe ist eine gute Idee, auf jeden Fall.

Stored Procedures sind keine Garantie, weil das, was tatsächlich ist anfällig jeder dynamischer Code ist, und das schließt Code innerhalb von gespeicherten Prozeduren und dynamisch auf gespeicherte Prozeduren erzeugen Anrufe.

parametrisierte Abfragen und gespeicherte Prozeduren mit Parametern aufgerufen sind beide unverwundbar Injektion, solange sie beliebige Eingaben keinen Code zu generieren verwenden. Beachten Sie, dass es viel dynamischen Code, der auch der Injektion nicht anfällig ist (zB integer Parameter in dynamischem Code).

Die Vorteile eines weitgehend (Ich bin nicht sicher, 100% wirklich möglich ist) gespeichert Procs-basierte Architektur ist jedoch, dass die Injektion kann auch etwas gegen verteidigt werden (aber nicht perfekt) für dynamischen Code auf der Client-Seite, weil :

Nur EXEC Berechtigungen für jeden Benutzer Kontext gewährt werden, die App unter verbindet, so dass jeder SELECT, INSERT, UPDATE, DELETE-Abfragen einfach fehlschlagen. Natürlich DROP usw. sollte ohnehin nicht erlaubt werden. So würde jede Injektion hat in Form von EXEC sein, also letztlich nur Operationen, die Sie in Ihrer SP Schicht definiert haben, werden auch zur Verfügung (nicht willkürlich SQL) seine gegen zu injizieren.

Unter den vielen anderen Vorteilen Ihren Datenbank-Service als eine Reihe von gespeicherten Prozeduren zu definieren (wie jede Abstraktionsschicht in Software) sind die Möglichkeit, Ihre Datenbank unter ohne Beeinträchtigung der Anwendungen Refactoring, die Fähigkeit, besser zu verstehen und die Nutzungsmuster zu überwachen in Ihre Datenbank mit einem Profiler, und die Fähigkeit, innerhalb der Datenbank, um selektiv zu optimieren, ohne dass neue Kunden einsetzen zu müssen.

Zusätzlich berücksichtigen feinkörnigen Datenbankzugriff, den Hauptbenutzer Ihrer Datenbank (auch allgemein Role Based Access Control genannt) sollte genau die Berechtigungen benötigt, um seine Arbeit und nichts anderes zu tun. Sie müssen keine neuen Tabellen nach der Installation erstellen? REVOKE, dass die Erlaubnis. Sie nicht ein legitimes Bedürfnis als sysdba laufen müssen? Dann tun Sie nicht! Eine hinterhältige Injektion der Benutzer anweist, „DROP DATABASE“ wird zunichte gemacht werden, wenn der Benutzer wurde, dass die Genehmigung nicht erteilt. Dann alles, was Sie befürchten müssen, ist daten undichte SELECT-Anweisungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top