2017-10-11 2 views
1

Für einige Funktionen innerhalb unserer ASP.NET (gegen SQL Server) -App erlauben wir den Mitarbeitern, eine WHERE-Klausel anzugeben. Diese WHERE-Klausel wird dann in Code an eine vom System generierte SELECT-Anweisung angehängt, um einige Daten abzurufen.Schutz der eingegebenen Daten gegen schlechtes Verhalten

Also im Grunde haben wir am Ende oben mit:

SELECT SomeFields FROM Sometable WHEREUserEnteredWhere

wo die fett das System und die kursiv der Benutzer . Dies funktioniert seit einiger Zeit und gibt uns eine gute Flexibilität.

aber es ist eindeutig ein großes Problem hier, wo, wenn ein Benutzer eingibt:

somefield = 1; DROP TABLE SomeTable;

Derzeit ist die einzige Validierung, ob die Anweisung mit einer SELECT beginnt die passieren, weil wir mit am Ende werden:

SELECT SomeFields FROM Sometable WHEREsomefield = 1; DROP TABLE SomeTable;

Die langfristige Lösung wäre nicht der Benutzer zu ermöglichen, SQL in ein Textfeld eingeben, aber auf kurze Sicht mag ich dies zu untermauern.

Die einzige Lösung, die ich mir vorstellen kann, besteht darin, jede Anfrage in einer Transaktion auszuführen, um sicherzustellen, dass kein langfristiger Schaden entsteht.

Hat jemand irgendwelche Vorschläge, wie ich die vom Benutzer eingegebene "Where-Klausel" validieren kann, um sicherzustellen, dass sie keinen DDL-Inhalt hat, noch bevor sie ausgeführt wird?

PS. Ich weiß, dass das oben genannte schlecht ist und nicht gemacht werden sollte, aber es ist das, was ich in einem Legacy-System habe (ich habe nicht geschrieben). Bitte versuche mir zu helfen, anstatt mir zu sagen, tu das nicht. :-)

+1

Beschränkung des Zugriffs einen anderen Weg. Wenn der Benutzer keine Erlaubnis zum Löschen hat, würde er es nicht fallen lassen. Hoffentlich würde jemand mehr Details hinzufügen. –

+0

Ich denke, der sichere Weg besteht darin, alle eingegebenen Wörter zu validieren und zu überprüfen, ob eingegebene Wörter zuerst einen schlechten Aktionsbefehl enthalten, bevor sie in die SQL-Abfrage übergeben werden. – Saif

+0

Wie erlauben Sie den Mitarbeitern, eine WHERE-Klausel anzugeben? Was ist, wenn Sie dem Benutzer erlauben, eine Liste von Schlüssel/Wert-Paaren zu übergeben und dann die Abfrage selbst zu erstellen? Das asp.net-Dienstkonto hätte immer noch die Berechtigung (eine weitere Sicherheitsachse, die Sie als jemand anders festsetzen könnten), und der Endbenutzer braucht keinen direkten Zugriff, oder? – Tipx

Antwort

1

Da ich eine schnelle Lösung brauchte ich diese von der SQL Server-Seite der Dinge letztlich endete die Bekämpfung:

  • Verwendung einer separaten Verbindung in .NET für diese Datenbank Wechselwirkungen Durch die.
  • T
  • Der Benutzer gesperrt ist nur für SELECT Aussagen lassen sich wie folgt:

SQL:

CREATE LOGIN MrReadOnly 
    WITH PASSWORD = 'LetMeIn!'; 

USE MyDatabase; 
CREATE USER MrReadOnly FOR LOGIN MrReadOnly; 
GO 

EXEC sp_addrolemember N'db_datareader', N'MrReadOnly' 
3

Sie kennen die richtige Antwort - Sie haben Ihre Anwendung der SQL-Injektion ausgesetzt. Im Allgemeinen sind Ad-hoc-Lösungen nicht robust. Und die Aussage in eine Transaktion zu setzen, hilft nicht. Schließlich könnte commit einer der Befehle sein.

Einige Schnittstellen haben das Äquivalent von "eine einzelne Abfrage ausführen". Das würde Ihr Problem ziemlich lösen, weil eine zweite Abfrage einen Fehler in der Anwendung erzeugen würde.

Ich würde vorschlagen, keine der folgenden Zeichen/Wörter in den nutzergenerierten Bedingungen erlaubt:

  • ;
  • update
  • delete
  • insert
  • create
  • exec
  • grant
  • und möglicherweise mehr
  • und möglicherweise auch select (es sei denn, Sie wollen Subqueries unterstützen)

Dies könnte zu einem gewissen Grad begrenzen, was für den Zustand erlaubt ist.

Dies ist keine Garantie gegen die Injektion, aber etwas, das die Dinge besser machen sollte.

+0

Zunächst überlege ich, COMMIT zu verbieten und alles in einer Transaktion zu verpacken. Auf diese Weise wird letztendlich keine Änderung bewirkt. Nicht großartig, aber eine einfachere Prüfung als das Hinzufügen zu einer unendlichen Liste. – TheEdge

Verwandte Themen