Mittwoch, 7. Januar 2009

News

präsentiert von: entwickler.com
Donnerstag, 7. Juli 2005

About Security #13: Mit Stored Procedures gegen SQL Injection

Die Verwendung von Prepared SQL Statements bzw. Stored Procedures ist neben der in About Security #12 beschriebenen Prüfung der Benutzereingaben eine weitere Möglichkeit, um SQL-Injection-Angriffe zu verhindern.

N E U ! Security aktuell
Täglich aktuelle Security-Infos!

Bei der Verwendung von Stored Procedures werden Templates der verwendeten SQL-Abfragen definiert und in der Datenbank gespeichert. Während der Programmausführung werden diese Templates um die übergebenen Parameter erweitert und ausgeführt. Prepared SQL Statements funktionieren ähnlich, die Templates werden jedoch während der Programmausführung an die Datenbank gesendet und von dieser dann gespeichert, ebenfalls um die Parameter erweitert und ausgeführt. Das Hinzufügen weiterer SQL-Befehle über die Parameter ist bei parametrisierten Abfragen nicht möglich.

Ein wichtiger Hinweis: Stored Procedures sind nicht von sich aus vor SQL Injection sicher. Werden sie auf herkömmliche Weise mit den Benutzereingaben aufgerufen, kann SQL-Code eingeschleust werden. Erst durch den parametrisierten Aufruf sind sie nach aktuellem Wissenstand vor SQL-Injection sicher.

Während Stored Procedures von der verwendeten Datenbank unterstützt werden müssen, können Prepared Statements auch vom Datenbank-Interface implementiert werden. Diese Prepared Statements auf der Clientseite bieten die gleiche Sicherheit wie ihre serverseitige Variante, profitieren aber nicht wie diese von etwaigen Optimierungen durch das Datenbanksystem.

Im Folgenden wird der Einsatz von Prepared Statements beschrieben. Ähnlich funktioniert die Verwendung von Stored Procedures.

Prepared Statements

Als Beispiel soll die Abfrage

SELECT * FROM Benutzer WHERE Ort = 

aus About Security #11 dienen. Wie dort gezeigt wurde, kann ein Angreifer diese Abfrage für einige Angriffe ausnutzen. Dies ist bei parametrisierten Aufrufen nicht möglich. Dabei werden die Eingaben gefiltert und der Typ entsprechend der gespeicherten Abfrage angepasst.

Allgemein lautet die obige Abfrage als Prepared Statement

SELECT * FROM Benutzer WHERE Ort = ?
About Security: Die komplette Serie

Für PHP gibt es je nach verwendeter Datenbank verschiedene Funktionen zum Erstellen vom Prepared Statements. Für PostgreSQL kann man die Abfrage als Prepared Statement als

 = pg_prepare("ort_abfrage", 'SELECT * FROM Benutzer WHERE Ort = ');

formulieren. Der Aufruf erfolgt dann über folgenden Funktionsaufruf:

 = pg_execute("ort_abfrage", );

Für MySQL sind entsprechende Funktionen in der experimentellen MySQL-Erweiterung MySQLi vorhanden.

Perls datenbankunabhängiges Datenbankmodul DBI stellt folgende Funktionen zur Verfügung:

 = ->prepare("SELECT * FROM Benutzer WHERE Ort = ?");
= ->execute( );

In Microsofts .NET-Framework könnte die parametrisierte Abfrage folgendermaßen formuliert werden:

SqlCommad cmd = new SqlCommand("SELECT * FROM Benutzer WHERE Ort = @ort;")
cmd.Parameters.Add("@ort", ort)

Für Java gibt es die Klasse PreparedStatement, mit der sich folgende Aufrufe ergeben:

reparedStatement ortabfrage = con.prepareStatement("SELECT * FROM Benutzer WHERE Ort = ?");
ortabfrage.setString(1, ort);
ResultSet rset = ortabfrage.executeQuery();
Weitere Maßnahmen

Um SQL Injection zu verhindern oder zumindest ihre Auswirkungen zu mindern, sind eine Reihe weiterer Maßnahmen hilfreich:

  • Der Benutzer, über den die Webanwendung auf die Datenbank zugreift, darf nur die absolut notwendigen Rechte besitzen. Sollen nur Daten abgefragt werden, reichen das Recht für den SELECT-Befehl und die Zugriffsrechte für die Tabellen mit den relevanten Daten aus. Damit kann ein erfolgreicher Angreifer zwar immer noch alle Daten aus diesen Tabellen lesen, aber wenigstens ist ihm keine Manipulation möglich. Niemals darf von einer Webanwendung aus mit Administratorrechten auf die Datenbank zugegriffen werden.
  • Sofern möglich, sollte der gesamte Zugriff auf die Datenbank über Stored Procedures ausgeführt werden. Dann benötigt der von der Webanwendung verwendete Datenbankbenutzer nur die Berechtigung zur Ausführung dieser Stored Procedures.
  • Nicht benötigte Extended Stored Procedures (z.B. xp_cmdshell für MS SQL), Stored Procedures etc. müssen entfernt oder dem für die Webanwendung verwendeten Datenbankbenutzer der Zugriff darauf verboten werden.
  • Um einem Angreifer keine Anhaltspunkte für seinen Angriff zu liefern, dürfen keine ausführlichen Fehlermeldungen ausgegeben werden. Diese sind in einem Logfile besser aufgehoben. Die Logfiles müssen regelmäßig auf verdächtige Einträge überprüft werden.
  • Sensitive Daten wie z.B. Passwörter dürfen nur verschlüsselt gespeichert werden.

Database-Intrusion-Protection-Systeme können Angriffe feststellen und abwehren. Sie werden in einer späteren Folge behandelt. In der nächsten Folge geht es um einen weiteren Angriff auf Webanwendungen: Cross-Site Scripting.

Wenn Sie Fragen oder Themenvorschläge haben, können Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!

Carsten Eilers

About Security – Übersicht zum aktuellen Thema "Sichere Webanwendungen"

Konferenzen

BASTA! Spring 2009

BASTA! Spring 2009

23.-27. Februar 2009
Maritim Rhein-Main Hotel Wissenschaftsstadt Darmstadt

Entwicklertage 2009

Entwicklertage 2009

23.-27. Februar 2009
Darmstadt

BASTA! Italia 2009

BASTA! Italia 2009

16.-18. März 2009
Holiday Inn EUR Parco dei Medici, Roma

PHPCon Italia 2009

PHPCon Italia 2009

18.-20. März 2009
Holiday Inn EUR Parco dei Medici, Roma

JAX 09

JAX 09

20.-24. April 2009
Rheingoldhalle Mainz

Eclipse Forum Europe 09

Eclipse Forum Europe 09

20.-24. April 2009
Rheingoldhalle Mainz

webinale 09

webinale 09

25.-27. Mai 2009
Berlin

RailsWayCon

RailsWayCon

25.-27. Mai 2009
Berliner Congress Center, Alexanderplatz, Berlin

Werbung
Top-Jobs

Endress+Hauser GmbH+Co. KG

Entwickler Datenbanksysteme (m/w)

Signsoft GmbH

Java-Entwickler (m/w)

Software & Support Verlag GmbH

Volontär (w/m) Redaktion, Vollzeit

Software & Support Verlag GmbH

Redakteur (m/w), Vollzeit

Software & Support Verlag GmbH

Lektor (m/w), Vollzeit
JAX 09

Magazine

Entwickler Magazin - Enterprise Technologies & Business Solutions

Entwickler Magazin

Enterprise Technologies & Business Solutions

dot.net magazin - die unabhängige Quelle für .NET-Technologien

dot.net magazin

Die Quelle für .NET-Technologien

Eclipse Magazin

Eclipse Magazin

Weltweit erstes Magazin für Eclipse-Entwickler

Java Magazin - Internet & Enterprise Technology

Java Magazin

Internet & Enterprise Technology

Ruby on Rails

RailsWay Magazin

Ruby on Rails

CREATE OR DIE - Ein Leben für die Kreativität

CREATE OR DIE

Ein Leben für die Kreativität

Business Technology - Management Magazin

Business Technology

Management Magazin

PHP Magazin - Professional PHP Development

PHP Magazin

Professional PHP Development

Bücher


hosted by HostEurope