permalink

0

Schutz vor SQL-Injections

Aus der neuen Serie auf Entwicklerblog.at.tf: Sicher­heit für Webseiten

Was sind SQL-Injections?

Als SQL-Injection ver­steht man die Auss­nutzung von schlecht pro­gram­mierten SQL-Abfragen, vor allem bei Authen­tifizierung von Besuch­ern.
Dabei wird das Prob­lem aus­genutzt, dass viele Webpro­gram­mierer die Nutzereingaben unge­filtert direkt in die SQL-Abfragen übernehmen.

Wie funk­tion­iert so einen SQL-Injection?
Hier ein kleines Beispiel in PHP, wie man eine User-Authentifizierung besser nicht bauen sollte:
1: $user­name = $_POST[’username‘];
2: $pass­word = $_POST[’password’];
3: $sql = “SELECT * FROM tbl_user WHERE user­name=’”. $user­name .“‘ AND pass­word=’”. $pass­word.“‘”;
4: …

Schaut ja eigentlich auf den 1. Blick recht harm­los aus: Die SQL– Abfrage soll mir all jene User zurück­liefern, bei denen entsprechen­der User­name und das Pass­wort übereinstimmen.

Wenn ich z.B. als User­na­men Karl übergebe und als Pass­wort Myver­long­pass­word würde die SQL fol­gen­der­maßen an den Server geschickt
wer­den:
SELECT * FROM tbl_user WHERE username=‘Karl’ AND password=‘Myverlongpassword’

Nun kommt aber der Clou an der ganzen Sache:
Wie wäre es, wenn wir als User­na­men Admin übergeben und als Pass­wort x’ OR 1=1′?
Die SQL-Abfrage würde wie folgt lauten:
SELECT * FROM tbl_user WHERE username=‘Admin’ AND password=‘x’ OR 1=1

Hop­pla, wenn es tat­säch­lich einen User mit dem Namen Admin gibt (solch einen Benutzer­na­men sollte man für Admins sowieso nicht ver­wen­den) wird noch überprüft, ob das Pass­wort ‘x’ ist oder ob die Zahl 1 gle­ich der Zahl 1 ist, was wohl immer und überall zutr­e­f­fen sollte. Wurde ein Account ‘Admin’
gefun­den, wird der User nun ein­gel­oggt, usw.

Wie schütze ich mich vor SQL-Injections?
Ein Grun­dregel für dich sollte beim Pro­gram­mieren immer lauten: In ein Pro­gramm oder Script darf nie etwas unge­filtert von Außen hereinkom­men. Das kön­nen Abfra­gen von anderen Web­di­en­sten, Schnittstellen, etc. sein oder wie in unserem Fall eben Tex­teingaben z.B. aus einem Formularfeld.

Um Eingaben zu fil­tern gibt es sehr viele ver­schiedene Möglichkeiten und Ansätze:
Eine sehr effek­tive Möglichkeit wäre, nur bes­timmte Zeichen wie z.B. a– z, A-Z, 0–9 durchzu­lassen. Hier­für gibt es bere­its zahlre­iche fer­tige Scripte, wie z.B. fol­gen­des PHP-Script:

$string = preg_replace ( ‘/[^a-z0-9 ]/i’, ”, $string );
Jedoch sollte man eventuell einige Son­derze­ichen für Pass­wörter erlauben, da diese das Knacken z.B. durch Brute­Force (durch­pro­bieren aller Kom­bi­na­tio­nen) erhe­blich erschw­eren oder zumin­d­est verlängern.

Eine weit­ere wichtige Funk­tion stammt direkt von MySQL:
mysql_escape_string()

Diese “escaped” zahlre­iche gefährliche Zeichen wie in unserem Beispiel das Apos­troph (‘) mit Hilfe von Back­slashes (\). In unserem Beispiel oben würde aus x’ OR 1=1 dann gle­ich x\’ OR 1=1 wer­den, was in der SQL-Abfrage keine Prob­leme bere­iten würde.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.

*