Ich habe eine Anwendung mit PHP 5.3.29 und MySQL 5.6.35. Ich benutzte SQLQUERY, um SQL-Anweisungen auszuführen, dann zu PDO mit vorbereiteten Anweisungen wechseln, um SQL-i zu vermeiden, aber wenn ich meine App mit ZAP 2.6.0 teste, kann ich bestätigen, dass das SQL-I immer noch auftritt, trotz der Verwendung von " PDO "und" bereiten "vor. Ich habe das allgemeine Protokoll bei MySQL aktiviert und nach allen Anweisungen gesucht, die ausgeführt wurden.PDO nicht filtern SQL Injection
Mein Code ist:
function cerrar_sesion($usuario) {
$pdo = new
PDO("mysql:"."host=".DB_SERVIDOR.";"."dbname=".DB_BASEDATOS,DB_USUARIO, DB_CLAVE);
$query = $pdo->prepare('UPDATE ADMIN_USUARIO SET USERID=\' \' WHERE C_USUARIO= :usuario');
$query->bindParam(':usuario',$usuario,PDO::PARAM_INT);
$query->execute();
$pdo = null;
.........
}
Überprüfen der DB log i den Parameter "C_USUARIO" sehen geändert, werden die folgenden drei Zeilen wurden von MySQL Log extrahiert:
227726 Abfrage UPDATE ADMIN_USUARIO SET USERID = ' 'WHERE C_USUARIO = '54/2' 227730 Abfrage UPDATE ADMIN_USUARIO SET USERID =' 'WHERE C_USUARIO = '108/2' 227732 Abfrage SET UPDATE ADMIN_USUARIO USERID =' 'WHERE C_USUARIO = '108/2'
Beachten Sie die Werte für C_USUARIO should't „/ 2“ haben, wurde die von ZAP injiziert
I PDO erwartet, dass die Injektion zu verhindern, aber dies war nicht der Fall ist, wie kann ich tun dies mit PDO ?
Bitte helfen Sie mir, ich werde es genießen.
Nur ... was? "Ich kann bestätigen, dass die SQL-I noch passiert"? Ich nehme an, Sie meinen SQL-Injektion? Haben Sie [Emulate Prepares] (http://php.net/manual/en/pdo.setattribute.php) ausgeschaltet? Ich bin mir nicht sicher, was MySQL tatsächlich protokolliert, wenn es zu vorbereiteten Anweisungen kommt, also könnte dies eine vollständig korrekte Ausgabe sein. –
Kannst du deine Frage klarer beantworten? Es tut mir leid, ich verstehe nur nicht, was passiert, was Sie erwarten. –