Bei Verwendung von PDO für den Zugriff auf die MySQL-Datenbank werden standardmäßig keine echten vorbereiteten Anweisungen verwendet. Um dieses Problem zu lösen, müssen Sie die Emulationseffekte vorbereiteter Anweisungen deaktivieren. Hier ist ein Beispiel für die Erstellung eines Links mit PDO:
Der Code lautet wie folgt:
$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
setAttribute() Diese Zeile ist obligatorisch und es weist PDO an, die Emulation vorbereiteter Anweisungen zu deaktivieren und echte vorbereitete Anweisungen zu verwenden. Dadurch wird sichergestellt, dass die SQL-Anweisung und die entsprechenden Werte nicht von PHP analysiert werden, bevor sie an den MySQL-Server übergeben werden (wodurch alle möglichen böswilligen SQL-Injection-Angriffe verhindert werden). Obwohl Sie das Zeichensatzattribut (charset=utf8) in der Konfigurationsdatei festlegen können, ist es wichtig zu beachten, dass die alte Version von PHP (< 5.3.6) den Zeichenparameter im DSN ignoriert.
Sehen wir uns ein vollständiges Beispiel für die Codeverwendung an:
Der Code lautet wie folgt:
$dbh = new PDO("mysql:host=localhost; dbname=dbtest", "user", "pass"); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果 $dbh->exec("set names 'utf8'"); $sql="select * from test where name = ? and password = ?"; $stmt = $dbh->prepare($sql); $exeres = $stmt->execute(array($testname, $pass)); if ($exeres) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { print_r($row); } } $dbh = null;
Oben: Dieser Code kann die SQL-Injection verhindern. Warum?
Beim Aufruf von „prepare()“ wurde die Abfrageanweisung an den Datenbankserver gesendet. Zu diesem Zeitpunkt wird nur der Platzhalter „?“ gesendet -Übermittelte Daten werden gesendet; Beim Aufruf werden die vom Benutzer übermittelten Werte unabhängig voneinander übertragen, und SQL-Angreifer haben keine Chance.
Aber worauf wir achten müssen, ist, dass PDO Ihnen nicht dabei helfen kann, eine SQL-Injection zu verhindern.
Sie können nicht zulassen, dass ein Platzhalter einen Satz von Werten ersetzt , wie zum Beispiel:
Der Code lautet wie folgt:
SELECT * FROM blog WHERE userid IN ( ? );
2 Sie können nicht zulassen, dass Platzhalter den Namen der Datentabelle oder Spalte ersetzen, wie zum Beispiel:
Der Code lautet wie folgt:
SELECT * FROM blog ORDER BY ?;
3. Sie können nicht zulassen, dass der Platzhalter ? eine andere SQL-Syntax ersetzt, wie zum Beispiel:
Der Code lautet wie folgt:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Das Obige ist der Inhalt des PDO-Mechanismus zur Verhinderung der SQL-Injection. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website ( www.php.cn)!