dedlfix: MYSQL mysqli_real_escape_string

Beitrag lesen

Tach!

$db = mysqli_connect('xxx', 'xxx', 'xxx', 'xxx') or exit;

Findest du es für Benutzer sonnvoll, bei einem Datenbankfehler die Arbeit sang- und klanglos einzustellen?

if(!empty($_POST['input1']))
{
    $benutzer = htmlspecialchars($_POST['input1']);
}

Hast du hier einen HTML-Kontext vorliegen? Ich meine jetzt, nicht erst irgendwann später. Sieht nicht so aus, also ist an der Stelle das htmlspecialchars() falsch.

$input1sql = mysqli_real_escape_string($db, $benutzer);
Zusätzlich dazu habe ich folgende Codezeile eingegeben, um zu testen, was mysqli_real_escape_string verändert:
echo $benutzer . '<br />' . $input1sql;
Jedoch zeigen beide Variablen das Gleiche ein, egal was ich eingebe. Ich habe es mit der Eingabe: testnutzer" OR 1 OR " versucht. Der echo ergab zwei identische Strings. Wie sicher ist der Code?

Nun, dein fehlerhaftes htmlspecialchars() hat die " zu &quot; verwurstet. &quot; enthält kein Zeichen, das von mysqli_real_escape_string() verändert wird. Du schaust dir beides im Browser an, und da kein HTML-Element geöffnet ist, in dem " eine Bedeutung hätte, zeigt der die " an, und aus dem &quot; macht er auch wieder ein ". Damit sieht beides gleich aus. Ein Blick in die Quelltextansicht oder die Ausgabe mit var_dump() hätte Unterschiede aufgezeigt. Bei var_dump() hätte die unterschiedliche Stringlänge auffallen müssen, auch wenn das Anzeigeergebnis dasselbe gewesen wäre, weil wieder das &quot; vom Browser weginterpretiert wird.

Derzeit habe ich noch nicht durchblickt, wie prepared Statements funktionieren. Bringt das deutlich mehr Sicherheit für die Abfrage?

Damit kann aus Prinzip keine SQL-Injection erfolgen, weil Code und Daten getrennte Wege gehen - wenn du sie konsequent einsetzt und nicht an ihnen vorbei variable Codeteile in die Query einsetzt.

dedlfix.