Heim > Datenbank > MySQL-Tutorial > Hauptteil

PDO-Mechanismus zur Verhinderung der SQL-Injektion

黄舟
Freigeben: 2017-02-25 10:28:25
Original
1431 Leute haben es durchsucht

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);
Nach dem Login kopieren


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 &#39;utf8&#39;");
$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;
Nach dem Login kopieren


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 ( ? );
Nach dem Login kopieren

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 ?;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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)!



Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!