SQL-Injection
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
beispiel
code
datenbank
eingabe
filtern
funktion
injektion
modul
neigen
reihe
schema
semikolon
set
statement
stehen
tabelle
text
update
wandeln
-
Hallo lima-city (User),
ich habe vor kurzer Zeit von einer sogenannten "SQL-Injection" erfahren und mich interessiert jetzt natürlich wie man sich davor schützen kann. Soweit ich das sehe braucht man immer ein Semikolon um eine Injektion durchzuführen, demnach könnte dies doch eigentlich helfen...
if (ereg(";", $variable) { echo "Es ist ein Fehler aufgetreten: Eine Injektion wurde erkannt."; }
...oder sehe ich das falsch?
dustin1
Beitrag zuletzt geändert: 19.2.2009 18:30:47 von dustin1 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was hat eine Injection mit einem Semikolon zu tun? Es gibt auch andere Möglichkeiten, Queries aneinander zu reihen:
$sql = "SELECT * FROM tabelle WHERE id = ".$_GET["id"];
seite.php?id= 1 AND UPDATE user SET password = 'hahaha' WHERE username = 'admin'
ergibt:
$sql = "SELECT * FROM tabelle WHERE id = 1 AND UPDATE user SET password = 'hahaha' WHERE username = 'admin'
Schau dir lieber mal mysql_real_escape_string() an.
Beitrag zuletzt geändert: 19.2.2009 18:35:58 von trueweb -
Vielen Dank für den Hinweis, ich schaue mir das später einmal an.
dustin1
Beitrag zuletzt geändert: 19.2.2009 18:51:50 von dustin1 -
Kochrezept gegen SQL-Injectons:
Folgendes Szenario:
Wir haben eine Seite die 2 GET Abfragen Entgegennimmt:
$id = $_GET['id']; $name = $_GET['name'];
Da wir für 'ID' _immer_ einen Zahlen Wert wollen und Text in dieser Variable nicht haben wollen wandeln wir sie einfach in ein Int um:
settype($id, 'integer');
Für 'name' wollen wir einen Text entgegennehmen. Um auszuschließen, dass Zeichen wie ' verwendet werden können benutzen wir die PHP Funktion 'mysql_escape_string' wobei einige eher zu 'mysql_real_escape_string' neigen, da diese Funktion auch noch die Kodierung der Datenbank mit einbezieht. Dafür muss aber eine Verbindung mit der Datenbank bereits stehen. Also hier mein Beispiel:
$name = mysql_escape_string($name);
Nun ist es wichtig die Variablen auch richtig in das SQL Statement einzubinden. Dafür muss man darauf achten, dass alle Variablen in Anführungszeichen gesetzt sind:
$query = ("SELECT user_login FROM $name WHERE ID = '$id'");
Wenn du diese Punkte beachtest, oder dir gleich ein Modul schreibst das alle SQL Abfragen in dem Schema ausführt bist du auf der sicheren Seite.
Achja,
@trueweb:
Dein Beispiel Query ist nicht Funktionsfähig ;)
Beitrag zuletzt geändert: 19.2.2009 18:48:53 von five-three-nine -
five-three-nine schrieb:
Achja,
@trueweb:
Dein Beispiel Query ist nicht Funktionsfähig ;)
Naja war auch nur ein Beispiel denke ich
Alternativ hätte auch nur stehen könenn:
seite.php?id=1 or 1=1
Dann werden alle Zeilen der Tabelle ausgegeben und das wäre glaube ich nicht Sinn der Sache gewesen oder?
Grüßle -
Naja er Vergewaltigt den "AND" Befehl.
Der ist nicht dazu da Statements zu verknüpfen oder aneinander zu Reihen ;) -
Das schaue ich mir späte auf jeden Fall auch noch einmal an, das scheint ja noch praktischer zu sein wenn er bösartige JavaScripts auch gleich herausfiltert.
dustin1 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage