Sicherheit in MYSQL
pattitheonly
- datenbank
0 Bio0 Robert Bienert0 Bio
Hallo Leute,
könntet Ihr mir sagen ob dieser Abschnitt sicher vor SQL Injections ist?
In der Abfrage bin ich mir nicht sicher.
$sql = mysql_query("SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer = '".$_POST['Benutzer']."'") or Fehler_4(&$Fehler_4);
Deshalb habe ich hier mysql_real_escape_string($_POST['Benutzer']) genommen. Aber die Funktion ist mir trotz nachlesen nicht wirklich klar. Ich mache damit einen String aus dem Wert in $_POST['Benutzer']?
Tausend Dank.
Patti
Sup!
SQL-Injektion geht immer dann, wenn ein Parameter ungefiltert in eine SQL-Abfrage eingebaut wird, so wie
$sql = .$_POST['Benutzer'].
hier.
Deshalb habe ich hier mysql_real_escape_string($_POST['Benutzer']) genommen. Aber die Funktion ist mir trotz nachlesen nicht wirklich klar. Ich mache damit einen String aus dem Wert in $_POST['Benutzer']?
Du maskierst damit wahrscheinlich alle Zeichen, die die Datenbank als Bestandteil einer SQL-Abfrage missverstehen könnte.
Aber ich kenne die Funktion auch nicht und kann es darum nicht sicher sagen. Muss doch im Handbuch stehen...
Gruesse,
Bio
Hi Bio,
was ich aber nicht hinbekommen hatte beim testen,mittels UNION den Feherfall auszulösen. Sollte doch so gehe, wenn ich den String nicht mit der Funktion filtere? Dann könnte ich auch überprüfen ob derSchutz auch funktioniert.
$sql = mysql_query("SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer = '".$_POST['Benutzer UNION SELECT Benutzer, Passwort, 'x' FROM Mitglieder']."'") or Fehler_4(&$Fehler_4);
Danke Dir.
Gruß Patti
Hello,
$sql = mysql_query("SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer = '".$_POST['Benutzer UNION SELECT Benutzer, Passwort, 'x' FROM Mitglieder']."'") or Fehler_4(&$Fehler_4);
das ergibt vieles, aber kein gültiges SQL. Probier doch einfach aus was passiert, wenn du
$sql = mysql_query("SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer ='"."' OR Benutzer LIKE '%"."'")
ausführst, lassen wir das POST mal außen vor, das tut ja nichts zur Sache.
Und nun probierst du aus, wenn du den Teil zwischen den Punkten mit mysql_real_escape_string umrahmst.
MfG
Rouven
Sup!
Benutzer = "' OR 1=1;"
oder
Benutzer = "bla'; drop table;"
ist doch auch immer gut...
Gruesse,
Bio
echo $begrüßung;
Benutzer = "' OR 1=1;"
Dieses Beispiel bringt einen Syntaxfehler, weil zusammen mit dem restlichen Statement ein ' zu viel ist. Über diese kleine Unachtsamkeit kann man hinwegsehen, aber
Benutzer = "bla'; drop table;"
dieses Beispiel funktioniert mit mysql_query() überhaupt nicht, weil MySQL es ablehnt, mehr als ein Statement pro Funktionsaufruf entgegenzunehmen. (Auch ist "drop table;" keine gültige Syntax, das Anliegen war aber wenigstens zu erkennen.)
echo "$verabschiedung $name";
Sup!
Ich bin beeindruckt; was Du alles weisst...
Gruesse,
Bio
Moin!
könntet Ihr mir sagen ob dieser Abschnitt sicher vor SQL Injections ist?
$sql = mysql_query("SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer = '".$_POST['Benutzer']."'") or Fehler_4(&$Fehler_4);
Nein, dieser Abschnitt ist nicht sicher, weil über $_POST['Benutzer'] und damit von außen SQL-Code eingeschleust und ausgeführt werden kann.
BTW: Notiert man das '&' vor der Variablen nicht im Funktionskopf, wenn man eine Referenz übergeben möchte?
Deshalb habe ich hier mysql_real_escape_string($_POST['Benutzer']) genommen.
Wenn das ganze dann so aussieht …
$sql = mysql_query("[code lang=sql]SELECT Benutzer, Passwort FROM Mitglieder WHERE Benutzer = '
".mysql_real_escape_string($_POST['Benutzer'])."'")
or Fehler_4(&$Fehler_4);[/code]
… ist schon sehr viel gewonnen, weil:
Aber die Funktion ist mir trotz nachlesen nicht wirklich klar. Ich mache damit einen String aus dem Wert in $_POST['Benutzer']?
mysql_real_escape_string maskiert alle potentiell gefährlichen Zeichen, so dass der Rückgabewert der Funktion (ein String) so wie oben in Abfragen eingebaut werden kann.
HTH und viele Grüße,
Robert
Hallo Robert,
danke für Deine ausführliche Erklärung. Hatte jetz auch noch einen guten Artikel dazu gelesen.
Gruß Patti
Sup!
Wie sind eigentlich die Felder in Deiner DB definiert?
Theoretisch könnte man bei festen Feldern ggf. eine second-level-SQL-Injection hinkriegen (wuhahaharr!)...
Dazu müssten allerdings Benutzer und Passwort Felder mit einer Maximallänge sein und es müsste eine Abfrage existieren, in der Benutzer und Passwort vorkommen.
Gruesse,
Bio