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. :-)
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. –
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
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