Man nehme folgenden Script-Aufbau:
<?php $mysqli = new mysqli('localhost', 'root', '', 'datatabletest'); $rating = $mysqli->real_escape_string($_GET['rating']); $sql = "SELECT name, rating FROM movies WHERE rating > " . $rating;
Da wir ja mustergültig escapen, sollte eigentlich nichts schief gehen – oder? Nun, der Benutzer übermittelt in $_GET[‚rating‘] folgenden Wert:
3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)
Der Wert von $sql lautet danach:
SELECT name, rating FROM movies WHERE rating > 3 AND 0 = IF(1, BENCHMARK(1000000, MD5(REPEAT(CONVERT(1, CHAR), 1000))), 0)
Ein astreines DoS-Einfallstor. In solchen Fällen besser intval verwenden.
Original entdeckt von ulf-wendel.de.
Das wär aber nicht passiert, wenn man $rating im SQL Query in einfache Hochkommas eingeschlossen hätte. Das versteh ich unter „mustergültig“, ansonsten ergibt das escapen keinen Sinn.
Grad darum gings mir. Ich hätte erwartet, dass das real_escape_string schon selbst übernimmt.
Warum sollte der Programmierer dort, wo in der SQL-Logik eine Zahl erwartet wird, eine Zeichenkette einfügen (Stichwort: Hochkomma)?
Prepared Statements FTW!