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
Susan SarandonOriginal
2024-12-26 01:48:09548Durchsuche

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();

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!

Stellungnahme:
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