2017-08-10 1 views
-1

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.

+0

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. –

+0

Kannst du deine Frage klarer beantworten? Es tut mir leid, ich verstehe nur nicht, was passiert, was Sie erwarten. –

Antwort

0

Standardmäßig "emuliert" PDO vorbereitete Anweisungen, indem die gebundenen Variablen in Ihre SQL-Abfragezeichenfolge interpoliert werden und diese SQL dann direkt ohne Verwendung von Parametern ausgeführt wird.

PDO wendet das korrekte Escaping an, da es Ihre Variablen in der Abfrage interpoliert, so dass es in Bezug auf SQL-Injection sicher ist.

Wenn Sie echte parametrisierte Abfragen, deaktivieren Emulation:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

http://php.net/manual/en/pdo.setattribute.php Siehe für weitere Informationen.

Wenn Sie die Emulation deaktivieren, werden in Ihrem MySQL-Abfrageprotokoll PREPARE und EXECUTE als separate Schritte angezeigt. Aber MySQL protokolliert auch die vollständige Abfrage einschließlich der Parameterwerte. Dies ist auch sicher, es ist nur eine Bequemlichkeit, die MySQL für die Protokollierung verwendet, weil es nützlich ist, die Abfrage mit Werten anzuzeigen. Siehe Beispiel in meiner Antwort auf https://stackoverflow.com/a/210693/20860.