Während die PDO-Dokumentation darauf hinweist, dass durch die Vorbereitung von Anweisungen keine manuelle Angabe von Parametern mehr erforderlich ist, lautet die Antwort nuanciert „Ja“. ." PDO emuliert standardmäßig vorbereitete Anweisungen für MySQL, und diese Emulation kann manchmal zu ausnutzbaren Schwachstellen führen.
Die potenzielle Schwachstelle entsteht, wenn die Verbindungskodierung bestimmte anfällige Zeichensätze umfasst (z. B. gbk , cp932) und die folgenden Bedingungen sind erfüllt:
In solchen Fällen ein Angreifer kann eine Nutzlast erstellen, die ein ungültiges Multibyte-Zeichen enthält, und die Diskrepanz zwischen dem erwarteten Zeichensatz auf dem Client und dem tatsächlichen Zeichensatz der Verbindung ausnutzen. Dadurch können sie ein Zeichen ohne Anführungszeichen in die generierte Abfragezeichenfolge einfügen, was zu potenziellen SQL-Injections führt.
Prävention:
Abwehr:
Der folgende Code Snippets veranschaulichen sichere Praktiken:
// PDO without emulated prepares $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // PDO with DSN charset parameter $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk', $user, $password); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // MySQLi (always uses true prepared statements) $mysqli->query('SET NAMES gbk'); $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $param = "xbf' OR 1=1 /*"; $stmt->bind_param('s', $param); $stmt->execute();
PDO-vorbereitete Anweisungen können SQL-Injections wirksam verhindern, wenn sie ordnungsgemäß und in Verbindung mit sicheren Praktiken verwendet werden. Es ist wichtig, anfällige Codierung zu vermeiden, emulierte Vorbereitungen zu deaktivieren oder den NO_BACKSLASH_ESCAPES-Modus zu aktivieren, um potenzielle Schwachstellen zu mindern.
Das obige ist der detaillierte Inhalt vonSind PDO-vorbereitete Anweisungen wirklich sicher vor SQL-Injection-Angriffen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!