SQL-Injektion - Hilfe!

aargau

Erfahrenes Mitglied
Hallo Zusammen,

Ich stehe vor einem sehr grossen Problem! Es hat mich heute jemand darauf aufmerksam gemacht das unsere Webseite wohl sehr leicht "Hack" bar seie. Nun habe ich das Problem das ich mich leider mit dem Problem (SQL-Injektion) nicht wirklich auskenne.

Bis jetzt sieht es bei mir eig so aus:

PHP:
<?php
$id = $_GET["id"] ; 
$daten = mysql_query("SELECT was, auch, immer FROM member WHERE id='$id'") ;
...
?>

Nun wollte ich Fragen wie ich das so umstellen kann das es danach vor SQL-Injektion`s Sicher ist?
Ich habe selbst den Test gemacht beim PN System. Ich konnte zwar keine einträge ändern, jedoch war die gesammte Zeile fehlerfaft. Anstelle von der User ID stand der Injection-Code da etc..

Bitte helft mir
 
Das heisst ich sollte wirklich alle Querys nochmal ändern mit dem:
mysql_real_escape_string($_POST['spalte2Wert'])
?

Und ist dies dann "sicher"?
Könnte man theoretisch nicht auch einfach extrem abartige namen für die Tabellen verwenden? Dann könnte man ja auch nichts mehr tun, ausser man weis wie sie heissen
 
Das heisst ich sollte wirklich alle Querys nochmal ändern mit dem:
mysql_real_escape_string($_POST['spalte2Wert'])
?
ja

Und ist dies dann "sicher"?
100% nicht, weil man nie sich 100% schützen kann aber zu 90% ja.

Könnte man theoretisch nicht auch einfach extrem abartige namen für die Tabellen verwenden? Dann könnte man ja auch nichts mehr tun, ausser man weis wie sie heissen
das ist sinnlos, weil man einfach mit +SHOW+TABLES; arbeiten kann.
 
Okay.

Dann weis ich wenigstens was ich heute Nacht zu tun habe :D Sonst Surf ich eh nur herum ^^

Gibt es sonst noch irgend welche grossen Risiko-Sicherheitslücken in PHP / My SQL, die man unbedingt beachten sollte?
 
100% nicht, weil man nie sich 100% schützen kann aber zu 90% ja.
Dann sollte man es so machen, wie ich es in einem anderen Thread schon vorgemacht habe:
PHP:
<?php
/* ... */
if(($HarmloseID = intval($_GET['id'])) == 0){
  echo("Fehlerhafte ID <br />\n");
}else{
  $daten = mysql_query("SELECT was, auch, immer FROM member WHERE id='".$HarmloseID."'");
  /* ... */
}
/* ... */
?>
Denn ich habe noch nie eine SQL Injektion gesehen, die man so zu 100% auch in einen Integer wandeln könnte.
Das Einzige, das du hierbei beachten musst ist, dass du keine ID 0 vergibst!

Falls deine Frage hiermit beantwortet sein sollte, dann markiere dieses Thread bitte als "Erledigt" (indem du den entsprechenden Button benutzt).
 
Solange es sich um IDs handelt kann man das sicher so machen, aber die ganzen Textfelder kann ich so ja nicht überprüfen und ich denke die sind genau so wichtig wie die IDs
 
Solange es sich um IDs handelt kann man das sicher so machen, aber die ganzen Textfelder kann ich so ja nicht überprüfen und ich denke die sind genau so wichtig wie die IDs
Nicht nur Textfelder stellen ein Problem dar, sondern einfach alles, was nicht ausschließlich Ganzzahl ist.
Dann muss man sich halt nach Alternativen umschauen - zum Beispiel preg_match(), falls die Eingabe einem bestimmten Muster entsprechen soll. Wobei ich mit "Muster" A-Z, a-z, 0-9 und nur bestimmte (Sonder-)Zeichen meine.
Eingaben zu überprüfen ist auf jeden Fall nicht verkehrt :)
 
Prinzipiell gilt es sämtliche vom Benutzer kommende Werte als nicht vertrauenswürdig einzustufen, da du ja keinen Einfluss darauf hast. Deswegen musst du sie auf Gültigkeit prüfen, ob sie also die erwarteten Eigenschaften erfüllen (Validierung).
Erfüllen sie diese nicht, hast du mehrere Möglichkeiten: Entweder du brichst das Skript ab oder du veränderst die ungültigen Wert so, dass sie wieder gültig sind. Dies ist bei den PHP-Datentypen am einfachsten, da hierzu einfach eine Typkonvertierung vorgenommen werden kann. Bei anderen Datendomänen (insbesondere Zeichenkettenformate) ist das jedoch schwieriger. Allgemein gibt es jedoch zwei Möglichkeiten: Filtern und Maskieren. Beim Filtern werden einfach alle ungültigen Eigenschaften entfernt. Beim Maskieren werden die ungültigen Zeichen durch gültige, aber äquivalente Maskierungsfolgen ersetzt. Dies macht beispielsweise die mysql_real_escape_string()-Funktion.
 
Reicht denn bei IDs die per GET übergeben werden
PHP:
intval($_GET['id'])
oder sollte ich diese besser so filtern das nur 0-9 verwedet werden (mit preg_match()) ?

Die Eingabefelder denk ich ist am sinnvolsten mit mysql_real_escape_string() zu überprüfen
 
Zurück