Moin!
gestern wurde mir erklärt, dass ich gegen MySql Injectionen meine POST/GET werte schützen soll. Wenn ich ein Insert Into durchführe würde nun so vorgehen:
$var1 = mysql_real_escape_string($_POST['var1']);
$var2 = mysql_real_escape_string($_POST['var2']);
Ich persönlich halte diese Umkopiererei für ungünstig, denn die Variablen $va1 und $var2 müssen ja auch noch irgendwann in den Query hineinkommen - und dort taucht dann logischerweise die Funktion mysql_real_escape_string() nicht mehr auf, man kann also DORT gar nicht sehen, ob die Variablen escaped werden, oder nicht.
Deshalb: Sorge immer für Klarheit über diese Dinge:
$sqlquery = "INSERT INTO tabelle SET wert1 = '".mysql_real_escape_string($_POST['var1'])."'";
Diese Zeile enthält mehrere wichtige Aussagen sofort sichtbar:
1. Der Wert, der in die Datenbank reingeht, wird escaped.
2. Der Wert, der reingeht, kommt aus einem POST-Formular (also externe Datenquelle).
Beide Faktoren sind enorm wichtig, um das Einschmuggeln von bösartigem Code zu unterbinden. Punkt 1 ist die Beruhigung für Punkt 2. Wenn du hingegen Variablen umkopierst, aus $_POST['var1'] eine deutlich harmloser wirkende $var1 machst, und in einer weiteren Zeile dann das Escaping einfügst, kommt am Ende zum Zusammensetzen des Querys sowas raus:
$sqlquery = "INSERT INTO tabelle SET wert1 = '$var1'";
Und das sieht auf den ersten Blick - wenn man geschult ist, auf sowas zu achten - EXTREM BÖSE aus, weil nirgendwo auch nur die geringste Sicherung gegen Code-Injection steht.
Auch wenn in den Zeilen davor vielleicht Escaping etc. durchgeführt werden könnte - kannst du 100% sicher sein, dass das unter allen Bedingungen passiert? Vielleicht klemmst du das Escaping ab, weil es ungünstig in einem IF steht, oder aus Versehen auskommentiert wird, etc...
1.Meine Fragen, muss ich das auch bei Radio und Checkbox durchführen?
Du mußt Escaping IMMER durchführen, wenn du Daten aus einem String in die Datenbank schreiben willst - egal wo dieser String herkommt. Auch die von deiner Applikation selbst erzeugten Strings mußt du escapen, wenn du jede Code-Injection in die SQL-Querys ausschließen willst.
Bei MySQL ist es dankenswerterweise so, dass keine Unterscheidung zwischen Strings und Zahlen gemacht wird: Alle Daten können immer in einfache Anführungszeichen eingeschlossen werden, und innerhalb dieser Anführungszeichen ist dann mysql_real_escape_string() anzuwenden - ohne Ausnahme!
2.muss ich bei Textfeldern bzw Textarea
$var2 = mysql_real_escape_string($_POST['var2']);
$var2 = htmlentities($var2);so vorgehen?
Nein. Du erhälst vom Formular nackten Text, sozusagen "text/plain" als Mimetyp. Das Escaping für die Datenbank mit mysql_real_escape_string() macht aus diesem Texttyp einen sql-kompatiblen Typ (nennen wir ihn mal "text/x-mysqltext").
Wenn du die Datenbank wieder abfragst, erhälst du als Ergebnis wieder "text/plain". Wenn du diesen dann als HTML-Bestandteil ausgeben willst (als "text/html"), benötigst du für die Ausgabe in HTML die Funktion htmlspecialchars() - die sorgt dafür, dass alle Zeichen in "text/plain" so konvertiert werden, dass sie auch als HTML genau identisch angezeigt werden.
Es ist blödsinnig, diesen Schritt schon vor der Speicherung in der Datenbank zu erledigen, denn es behindert dich beim Suchen in der Datenbank und stört vor allem dann, wenn du außer der Ausgabe in HTML noch weitere Zielausgabeformate hast oder irgendwann dazu bekommen könntest. Denn dann mußt du die HTML-Codierung rückgängig machen, um für das andere Zielformat neu zu codieren oder zu escapen.
- Sven Rautenberg
"Love your nation - respect the others."