17.2 SQL Injection ![top](common/15x15leer.gif)
![Zur vorigen Überschrift](common/15x15leer.gif)
Mangelnde Überprüfung von Benutzereingaben
Mit SQL Injection wird das Ausnutzen einer Sicherheitslücke, die durch mangelnde Überprüfung oder Maskierung von Benutzereingaben beim Zugriff auf SQL-Datenbanken entsteht, bezeichnet. Der Angreifer versucht, über die Formulare der Applikation, die den Zugriff auf die Datenbank ermöglichen, eigene Befehle abzusetzen, um Daten zu verändern, zu löschen oder sogar die Kontrolle über den Server zu erhalten.
Eine SQL Injection ist immer dann möglich, wenn eine Applikation Benutzer eingaben als Teil einer SQL-Abfrage an den Server weiterleitet, ohne die Benutzereingaben auf etwaige enthaltene Metazeichen (umgekehrter Schrägstrich, Apostroph, Anführungszeichen, Semikolon) zu prüfen und diese zu maskieren.
Wie Sie Ihre Applikation vor einer SQL Injection schützen
Automatischer Schutz
Solange Sie die von ActiveRecord zur Verfügung gestellten Methoden wie z. B. find und save nutzen, ohne conditions, limits oder eigene SQL-Abfragen zu formulieren, übernimmt ActiveRecord automatisch die Maskierung aller Metazeichen.
Eigene Maßnahmen
Sobald Sie eigene Bedingungen (conditions) oder ganze SQL-Abfragen selbst formulieren, müssen Sie darauf achten, dass Sie die Metazeichen maskieren. Deshalb sollten Sie Benutzereingaben nie ohne sie zu maskieren direkt in eine SQL-Abfrage übernehmen:
Flight.find(:all, :conditions => "code = '#{@params['code']}'")
Das ist gefährlich. Ein Angreifer könnte über den Parameter »code« folgende Zeichenkette senden:
'OR 1 --'
Der Aufruf des find -Befehls würde dann wie folgt lauten:
Flight.find(:all, :conditions => "code = '' OR 1 --''")
Die Zeichenkette 'OR 1 --' bewirkt, dass die Bedingung immer erfüllt ist, und die beiden Striche am Ende bewirken, dass der nachfolgende SQL-Code, sollte er existieren, auskommentiert wird. Das heißt, mit dieser Abfrage würden alle Flüge ausgegeben.
Array statt Zeichenkette
Verhindern können Sie das, indem Sie der find -Methode ein Array statt einer Zeichenkette übergeben:
Flight.find(:all, conditions => ["code = ?", @params['code']]) # oder Flight.find(:all, :conditions => {:code => @params['code']})
ActiveRecord ersetzt automatisch den Platzhalter (?) in Element 1 des Arrays durch das Element 2, setzt dabei automatisch Anführungszeichen um Zeichenketten und maskiert die Metazeichen für den verwendeten Datenbankadapter.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.