4x bewertet

SQL Injections vermeiden

von Nekoji  |  10.07.2008 um 13:19 h
PHP Grundlagen
Typ: PHP Grundlagen
Stufe:Mittel
Was eine SQL-Injection alles anrichten kann, habt ihr sicherlich schon bemerkt. Diese Angriffe basieren hauptsächlich auf eurem Code, der gerade bei Anfängern viele Sicherheitslücken aufweist. Diese Lücken können ausgenutzt werden um Daten aus eurer Datenbank auszulesen und im schlimmsten Falle um Schaden anzurichten.

Es gibt allerdings einige Methoden um SQL-Injections zu vermeiden, die ich euch in diesem Tutorial etwas näher bringen möchte.

Die Problemstellen sind die, wo eure Datenbank abgefragt wird oder wo ihr etwas in diese eintragt. Diese Stelle gilt es vor Fremdeingriffen zu schützen. Am besten zeige ich euch aber mal an einem Beispiel, was ich meine.

Nehmen wir also mal an, wir haben ein Formular in das die Besucher Name und Email-Adresse eintragen (z.B. bei einer Registrierung). Später soll dann dieses Formular verabeitet werden und die angegebenen Daten sollen in unsere Datenbank eingetragen werden. An dieser Stelle gilt es nun aufzupassen!



<?php
$eintrag 
"INSERT INTO mitglieder (name, email) VALUES
('"
.$_POST['name']."','".$_POST['email']."')";
$eintragen mysql_query($eintrag); 
?>




Wie ihr seht werden die Felder "name" und "email" aus dem Formular direkt und ungeschützt in die Datenbank eingetragen. Dort ist es möglich über das Formular eine SQL-Injection zu machen. Um dies zu verhindern greifen wir nun auf die Funktion addslashes() zurück:



<?php
$eintrag 
"INSERT INTO mitglieder (name, email) VALUES
('"
.addslashes($_POST['name'])."','".addslashes($_POST['email'])."')";
$eintragen mysql_query($eintrag); 
?>




Durch die Escape-Funktion addslashes() werden Zeichen wie ' oder ", die wichtig für die SQL-Injection sind, escaped. Aus ' wird also \' und aus " wird \". Statt addslashes() können auch andere Escape-Funktionen wie
mysql_real_escape_string() , sql_escape_string() , addcslashes() usw. genutzt werden. Wichtig ist aber erstmal, dass unsere Datenbank nun vor Fremdeingriffen sicher ist.

Jeder der also Skripte verwendet, die mit Datenbanken arbeiten, sollte seinen Code nun nach Sicherheitslücken
durchsehen und ihn, wie hier beschrieben, schützen.

(Eine Überarbeitung von Delite's Login-Skript folgt bald.)



8 Kommentare




madi

Wow! Danke!! Das ist echt ein wichtiges Thema und du hast alles super erklärt.
6 Sterne!
am 10.07.2008 um 16:43 Uhr


Wollte schon immer mal einen vereinfachten Bericht bzw. ein Tutorial über SQL Injection lesen. Smilie

Ist toll erklärt, 6 Sterne!
am 10.07.2008 um 18:31 Uhr


Mh, moment, fehlt da nicht ein Verb bei:
Durch die Escape-Funktion addslashes() werden escaped Zeichen wie ' oder ", die wichtig für die SQL-Injection sind.


Oder irre ich mich da? o__O XD
Ist ja eigentlich schlimm, verstehtman trotzdem..
und sorry für Doppelkommentar.
am 10.07.2008 um 18:32 Uhr


OMG!
Ist ja eigentlich NICHT schlimm, so sollte es heißen.

Löscht die Kommentare meinetwegen oder fasst sie zusammen..
am 10.07.2008 um 18:33 Uhr


Nekoji

Hast natürlich Recht,
danke für den Hinweis. ;)
am 10.07.2008 um 18:48 Uhr


Bianca

Sehr wichtiges und gutes Tutorial!
Aber ist es nicht sicherer die mysql_real_escape_string-Funktion zu verwenden? Ich hatte irgendwann mal gelesen, dass die Addslashes-Funktion Probleme bei Arrays und ´-Zeichen hat.
am 18.11.2008 um 11:02 Uhr


Hallo,

wen du schon in deinem Tutorial zeigst,
dass du mit addslashes() sqlinjectionen vermeiden kannst, solltest du auch zeigen wie man Dann noch alles auslesen sollte.

Stripslashes()
und beim eintragen nutzt man normalerweise sowieso kein "mysql_real..", diese funktion nutzt man in einer where clausel...

Mit freundlichen grüßen
am 23.12.2008 um 19:49 Uhr


Nekoji

@rockable: Da hast du Recht. Hatte ja auch mehrere Funktionen zum escapen aufgelistet. Vielleicht sollte ich noch dazu schreiben, dass sich mysql_real_escape_string() am besten eignet.

@Sven_E: Ja, könnte man eventuell noch anmerken, aber in dem Tutorial ging es ja eher darum Abfragen und Einträge sicher zu machen.
Und mysql_real_escape_string() ist nicht nur für where-clauses gedacht. Es geht schlicht und einfach darum die Strings zu maskieren. Was du dann mit den Strings machst, also ob du damit eine Datenbank abfragst oder etwas dort einträgst, ist völlig egal.
am 07.04.2009 um 14:04 Uhr