dedlfix: SQL-Injektion Schutz auch bei Prepared Statements?

Beitrag lesen

Hi!

Es soll die Verfälschung der Daten, die durch ggf. aktiviertes magic_quotes_gpc entstanden ist, wieder rückgängig machen.
Ich weiß schon, dass eingeschaltetes MAGIC QUOTES zu einem Escapen führt und stripslashes das wieder rückgängig macht.
Ich meinte vielmehr, dass durch die Verwendung von Prepared Statements - zumindesht habe ich das bisher so verstanden - egal ist, was der User eingibt, weil die Eingabe von der Ausführung (oder was auch immer) getrennt ist. Also das 1:1 die Eingabe aus dem Formular eingetragen wird. Mit allen Slashes, Anführungszeichen, etc.

Ja, aber diese maskierenden Slashes willst du nicht im DBMS haben, denn sie sollen kein Bestandteil der Nutzdaten sein, sondern sind eigentlich für eine Maskierung für Strings im SQL-Statement vorgesehen. Bei Prepared Statements werden alle Zeichen wörtlich genommen, also auch eventuell enthaltene Slashes werden wie Nutzdaten behandelt, egal ob es absichtlich eingegebene oder von Magic Quotes hinzugefügte sind.

$vorname=$_POST["vorname"];
$familienname=$_POST["familienname"];

Das Umkopieren bleibt auch im "Prepared-Statements-Zeitalter" unnötig.

$aktion='INSERT INTO 014\_testbank (testbank\_vorname, testbank\_familienname) VALUES (?, ?)';
$eintrag=$meine_datenbank->prepare($aktion );
$eintrag->bind_param('ss',$vorname,$familienname);
$eintrag->execute();
if($eintrag->affected_rows==1)
    echo"<p>Der Datensatz " ".htmlentities($vorname)." ".htmlentities($familienname)." " wurde der Datenbank hinzugefügt.</p>\n";
else
    echo"<p>Der Datensatz konnte der Datenbank leider nicht hinzugefügt werden.</p>\n";

Die Auswertung von affected_rows ist keine Fehlerbehandlung. affected_rows sagt nur, wieviele Datensätze geändert wurden. Wenn die Daten gleich bleiben, wird nichts geändert, affected_rows ergibt 0, aber ein Fehler ist das per se erst einmal nicht. Fehlerzustände werden immer noch über die Rückgabewerte der Funktionen/Methoden bekanntgegeben.

Wenn jetzt MAGIC QUOTES eingeschaltet _wäre_ (das habe ich abgedreht) und ich _nicht_ ein
if (get_magic_quotes_gpc()) { $_POST = array_map( 'stripslashes', $_POST ); }
verwende, was kann dann passieren?

Jemand, der O'Brien heißt, wird als O'Brien im DBMS landen.

Ich bin jetzt _sehr_ verwirrt, weil ich so oft gelesen habe, ich brauche mir bei Verwendung von mysqli und Preparede Statements keine weiteren Sorgen machen!?

Keine Sorgen machen ist nicht gut. Prinzip verstehen und wissen, was oder dass nichts passieren kann, wäre besser. Wenn du weißt, dass Prepared Statements die Daten im Rohformat haben wollen, musst du dafür Sorge(!) tragen, dass sie auch in einem solchen vorliegen, und nicht einfach nur mit einem "mir kann nichts passieren"-Lächeln den Blick abwenden.

Lo!