Heim > Backend-Entwicklung > PHP-Tutorial > Sind PDO-vorbereitete Anweisungen wirklich sicher vor SQL-Injection-Angriffen?

Sind PDO-vorbereitete Anweisungen wirklich sicher vor SQL-Injection-Angriffen?

Susan Sarandon
Freigeben: 2024-12-26 01:48:09
Original
538 Leute haben es durchsucht

Are PDO Prepared Statements Truly Safe from SQL Injection Attacks?

Sind vorbereitete PDO-Anweisungen immun gegen SQL-Injections?

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.

Der Angriffsvektor

Die potenzielle Schwachstelle entsteht, wenn die Verbindungskodierung bestimmte anfällige Zeichensätze umfasst (z. B. gbk , cp932) und die folgenden Bedingungen sind erfüllt:

  1. Der Datenbankzeichensatz wird mit SET festgelegt NAMEN (anstelle von mysql_set_charset()).
  2. Der Client verwendet emulierte vorbereitete Anweisungen (oder echte vorbereitete Anweisungen, die der MySQL-Server als emuliert behandelt).

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.

Die Korrekturen

Prävention:

  • Emuliert vorbereitete Anweisungen deaktivieren: $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  • Verwenden Sie den PDO-DSN-Charset-Parameter, um die Zeichenkodierung festzulegen (PHP >= 5.3.6): $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk ', $user, $password);
  • Anfällige Codierung vermeiden: Verwenden Sie Zeichensätze wie UTF-8 oder Latin1, die nicht anfällig sind Dieser Angriff.

Abwehr:

  • Aktivieren Sie den SQL-Modus NO_BACKSLASH_ESCAPES: Dies ändert das Verhalten des Zeichen-Escapes und verringert so die potenzielle Schwachstelle.

Sichere Beispiele

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

Fazit

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!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage