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).
quelle
Antworten:
Gespeicherte Procs schützen nicht automatisch vor Injektionen. Was ist damit?
Durch die Verwendung parametrisierter Abfragen werden Sie vor Injection geschützt, unabhängig davon, ob es sich um Procs handelt oder nicht.
quelle
Nein, weil sie den Entwicklern eine schwere Strafe auferlegen. Eine Aufschlüsselung nach Artikeln:
Verwenden Sie Rollen. Clients sollten nur über eine eingeschränkte Rolle auf die Datenbank zugreifen können, die nur über SELECT-, INSERT-, UPDATE- und DELETE-Zugriff auf die Tabellen (und Zeilen, sofern möglich) verfügt, auf die sie Zugriff benötigen. Wenn Sie sicherstellen möchten, dass kein Client alle Einträge als Spam versenden oder löschen kann, verwenden Sie eine API zur Datenänderung.
Dies kann je nach Effizienz der Ansichten von vernachlässigbar bis zu enormen Leistungskosten führen. Es ist unnötige Komplexität, die die Entwicklung verlangsamt. Verwenden Sie Rollen.
Könnte eine Menge Arbeit bedeuten und sollte wahrscheinlich in eine separate Tabelle normalisiert werden.
Das ist einfach falsch. Wenn die Entwickler nicht in der Lage sind, mit
NULL
s umzugehen, haben Sie große Probleme.Sie benötigen keine gespeicherten Prozeduren, sondern verwenden nur parametrisierte Abfragen mit einer Funktion, die sich den Argumenten entzieht, wie z. B. pg_query_params . Natürlich, wenn Ihre Datenbank von der Welt beschreibbar ist oder die Client-Rolle vollen Zugriff auf alles hat, sind Sie sowieso beschissen. Jemand muss einfach mitkommen und erkennen, was der Kunde tut, und dann in fünf Minuten einen Kunden ausheizen, der Ihre Datenbank zerstört (oder schlimmer noch, vergiftet).
quelle
Ich bin mir nicht sicher, ob deine Regeln dich vollständig schützen.
Das erste Problem ist, dass Sie angeben, dass sie durchgesetzt werden, aber ich habe nie eine perfekte Durchsetzung gesehen, obwohl sie einen erheblichen Mehraufwand mit sich bringt.
Zweitens ist meine Lektüre, dass Regeln wie diese die Ausnutzung der Dinge erschweren, aber sie verhindern es nicht. Wenn Sie beispielsweise keinen direkten Zugriff auf die Tabellen haben, ändert sich nicht viel, wenn Sie in den Ansichten auf dieselben Daten zugreifen können. Wenn der Client etwas tun muss, muss eine Ansicht dies ermöglichen, und wenn eine Ansicht dies ermöglicht, kann ein Angreifer dieselben Funktionen / Daten verwenden.
Denken Sie auch daran, dass es nicht nur um das Aktualisieren oder Löschen von Daten geht. Ein Teil der Sicherheitsanfälligkeit bei SQL Injection ist das Sammeln von Informationen. Dabei ist es Ihnen egal, ob die Daten über die View vCustomers- oder die zugrunde liegende Customers-Tabelle zurückgegeben wurden. Sie haben sich vielleicht vor einigen Schwächen geschützt, aber nicht vor allen. In ähnlicher Weise kann SQL geschrieben werden, um die Trigger auszulösen und Aktualisierungen vorzunehmen, wenn die Aktualisierungen vom Client vorgenommen werden können, auch wenn sie durch Trigger ausgeführt werden.
(In Bezug auf alle Aktualisierungen, die über Trigger vorgenommen werden, möchte ich zwei Dinge sagen: (1) Als ich dies las, war ich ein bisschen krank im Mund und (b) Sie mögen gespeicherte Prozeduren nicht, weil sie Sie sind "weniger wartbar, weniger testbar, stark gekoppelt und haben ein System an einen einzigen Anbieter gebunden", aber Sie verwenden Trigger, über die im Grunde die gleichen Dinge gesagt werden können.)
Alles, was Sie brauchen, ist eine Lücke, die die Ausführung von SQL-Anweisungen ermöglicht (und ich sehe keine dieser Regeln, die dies verhindern), und der Angreifer ist dabei. Er findet möglicherweise eine sehr unintuitive Datenbank dahinter, aber wenn er dies bestimmt verlangsamen sie nur, anstatt sie zu stoppen).
Die andere Sache hier ist, dass Sie auch Komplexität hinzufügen und (ebenso wie der Aufwand, der entsteht), Komplexität dazu neigt, zu Lücken zu führen, die ausgenutzt werden können.
Ich sage nicht, dass ein solches Regelwerk nicht erstellt werden kann - mehr, warum sollten Sie sich die Mühe machen? Sie scheinen umständlicher und weniger zuverlässig zu sein, als nur mit den allgemein anerkannten Methoden zur Verhinderung solcher Angriffe umzugehen.
quelle