Alles, was ich bei SQL-Injection-Angriffen gesehen habe, scheint darauf hinzudeuten, dass parametrisierte Abfragen, insbesondere in gespeicherten Prozeduren, der einzige Weg sind, um sich vor solchen Angriffen zu schützen. Während meiner Arbeit (im dunklen Zeitalter) galten gespeicherte Prozeduren als schlechte Praxis, hauptsächlich weil sie als weniger wartbar angesehen wurden. weniger testbar; stark gekoppelt; und sperrte ein System in einen Lieferanten; ( Diese Frage deckt einige andere Gründe ab).
Während meiner Arbeit waren sich die Projekte der Möglichkeit solcher Angriffe praktisch nicht bewusst. Es wurden verschiedene Regeln verabschiedet, um die Datenbank gegen Korruption verschiedener Art zu sichern. Diese Regeln können wie folgt zusammengefasst werden:
- Kein Client / keine Anwendung hatte direkten Zugriff auf die Datenbanktabellen.
- Alle Zugriffe auf alle Tabellen erfolgten über Ansichten (und alle Aktualisierungen der Basistabellen erfolgten über Trigger).
- Für alle Datenelemente wurde eine Domäne angegeben.
- Kein Datenelement durfte nullwertfähig sein - dies hatte Auswirkungen darauf, dass die DBAs gelegentlich die Zähne knirschten. wurde aber durchgesetzt.
- Rollen und Berechtigungen wurden entsprechend eingerichtet - beispielsweise eine eingeschränkte Rolle, um nur Ansichten das Recht zu geben, die Daten zu ändern.
Ist eine Reihe von (erzwungenen) Regeln wie diese (wenn auch nicht unbedingt diese) eine geeignete Alternative zu parametrisierten Abfragen, um SQL-Injection-Angriffe zu verhindern? Wenn nein, warum nicht? Kann eine Datenbank durch (nur) datenbankspezifische Maßnahmen gegen solche Angriffe gesichert werden?
BEARBEITEN
Der Schwerpunkt der Frage hat sich im Lichte der eingegangenen ersten Antworten geringfügig geändert. Grundfrage unverändert.
EDIT2
Der Ansatz, sich auf parametrisierte Abfragen zu verlassen, scheint nur ein Randschritt bei der Abwehr von Angriffen auf Systeme zu sein. Es scheint mir, dass grundlegendere Abwehrmaßnahmen wünschenswert sind und das Verlassen auf solche Abfragen möglicherweise nicht erforderlich oder weniger kritisch erscheinen lassen, selbst wenn sie speziell gegen Injektionsangriffe verteidigt werden sollen.
Der in meiner Frage implizierte Ansatz beruhte auf der "Panzerung" der Datenbank, und ich hatte keine Ahnung, ob dies eine praktikable Option war. Weitere Untersuchungen haben ergeben, dass es solche Ansätze gibt. Ich habe die folgenden Quellen gefunden, die einige Hinweise auf diese Art von Ansatz geben:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Die Hauptmerkmale, die ich diesen Quellen entnommen habe, sind:
- Ein umfangreiches Datenwörterbuch, kombiniert mit einem umfangreichen Sicherheitsdatenwörterbuch
- Generierung von Triggern, Abfragen und Constraints aus dem Data Dictionary
- Code minimieren und Daten maximieren
Während die Antworten, die ich bisher hatte, sehr nützlich sind und auf Schwierigkeiten hinweisen, die sich aus der Nichtbeachtung parametrisierter Abfragen ergeben, beantworten sie letztendlich nicht meine ursprünglichen Fragen (die jetzt fett hervorgehoben sind).