Rumah >pembangunan bahagian belakang >tutorial php >Adakah Penyata Disediakan PDO Benar-benar Selamat daripada Serangan Suntikan SQL?

Adakah Penyata Disediakan PDO Benar-benar Selamat daripada Serangan Suntikan SQL?

Susan Sarandon
Susan Sarandonasal
2024-12-26 01:48:09549semak imbas

Are PDO Prepared Statements Truly Safe from SQL Injection Attacks?

Adakah Penyata Disediakan PDO Kebal terhadap Suntikan SQL?

Walaupun dokumentasi PDO mencadangkan bahawa penyediaan kenyataan menghapuskan keperluan untuk petikan parameter manual, jawapannya adalah bernuansa "ya ." PDO meniru penyataan yang disediakan untuk MySQL secara lalai, dan emulasi ini kadangkala boleh mewujudkan kelemahan yang boleh dieksploitasi.

Vektor Serangan

Kerentanan berpotensi timbul apabila pengekodan sambungan melibatkan set aksara terdedah tertentu (cth., gbk , cp932) dan syarat berikut ialah met:

  1. Set aksara pangkalan data ditetapkan menggunakan SET NAMES (bukan mysql_set_charset()).
  2. Pelanggan menggunakan kenyataan yang disediakan yang dicontohi (atau kenyataan yang disediakan benar yang pelayan MySQL layan seperti yang dicontohi).

Dalam kes sedemikian, penyerang boleh membuat muatan yang mengandungi aksara multibait tidak sah dan mengeksploitasi percanggahan antara set aksara yang dijangkakan pada klien dan set aksara sebenar sambungan. Ini membolehkan mereka menyuntik aksara yang tidak disebut ke dalam rentetan pertanyaan yang dijana, yang membawa kepada potensi suntikan SQL.

Pembetulan

Pencegahan:

  • Lumpuhkan kenyataan yang disediakan yang dicontohi: $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  • Gunakan parameter charset DSN PDO untuk menetapkan pengekodan aksara (PHP >= 5.3.6): $pdo = new PDO('mysql :host=localhost;dbname=testdb;charset=gbk', $user, $password);
  • Elakkan pengekodan terdedah: Gunakan set aksara seperti UTF-8 atau Latin1 yang tidak terdedah kepada serangan ini.

Mitigasi:

  • Dayakan mod SQL NO_BACKSLASH_ESCAPES: Ini mengubah tingkah laku watak melarikan diri, mengurangkan potensi kelemahan.

Contoh Selamat

Coretan kod berikut menggambarkan amalan selamat:

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

Kesimpulan

PDO kenyataan yang disediakan boleh menghalang suntikan SQL dengan berkesan apabila digunakan dengan betul dan bersama-sama dengan amalan selamat. Adalah penting untuk mengelakkan pengekodan yang terdedah, melumpuhkan persediaan yang dicontohi atau mendayakan mod NO_BACKSLASH_ESCAPES untuk mengurangkan kemungkinan kelemahan.

Atas ialah kandungan terperinci Adakah Penyata Disediakan PDO Benar-benar Selamat daripada Serangan Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn