Rumah > pembangunan bahagian belakang > tutorial php > Bagaimana untuk Mencegah Suntikan SQL dengan Berkesan dalam Aplikasi PHP?

Bagaimana untuk Mencegah Suntikan SQL dengan Berkesan dalam Aplikasi PHP?

Linda Hamilton
Lepaskan: 2024-12-30 06:36:10
asal
415 orang telah melayarinya

How to Effectively Prevent SQL Injection in PHP Applications?

Cara Mencegah SQL Injection dalam PHP

Memasukkan input pengguna secara langsung ke dalam pertanyaan SQL tanpa sebarang pengubahsuaian menyebabkan aplikasi terdedah kepada serangan suntikan SQL. Untuk mengelakkan ini, adalah penting untuk mengasingkan data daripada SQL untuk memastikan data kekal sebagai data dan tidak pernah ditafsirkan sebagai arahan oleh penghurai SQL.

Penyelesaian Paling Berkesan

Pendekatan yang disyorkan untuk mengelakkan serangan suntikan SQL, tanpa mengira pangkalan data yang digunakan, adalah menggunakan penyata yang disediakan dan pertanyaan berparameter. Ini adalah pernyataan SQL yang dihuraikan secara bebas oleh pelayan pangkalan data bersama-sama dengan parameter. Pendekatan ini menjadikan penyerang mustahil untuk menyuntik SQL berniat jahat.

Pelaksanaan Menggunakan PDO atau MySQLi

PDO menyediakan penyelesaian universal untuk semua pemacu pangkalan data yang disokong, manakala MySQLi adalah khusus kepada MySQL.

Menggunakan PDO

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // Do something with $row
}
Salin selepas log masuk

Menggunakan MySQLi (PHP 8.2 dengan execute_query())

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);

while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Salin selepas log masuk

Menggunakan MySQLi (PHP 8.1 dan lebih awal)

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies string type
$stmt->execute();
$result = $stmt->get_result();

while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Salin selepas log masuk

Persediaan Sambungan Betul

Apabila menggunakan PDO untuk MySQL, pastikan kenyataan yang disediakan sebenar digunakan dengan melumpuhkan emulasi.

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Salin selepas log masuk

Untuk MySQLi, gunakan yang berikut:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // charset
Salin selepas log masuk

Penjelasan

Pernyataan yang disediakan dihuraikan dan disusun oleh pelayan pangkalan data , memisahkan pernyataan SQL daripada parameter. Apabila parameter diluluskan, ia digabungkan dengan pernyataan yang disusun sebagai rentetan, menghapuskan risiko suntikan SQL.

Pertanyaan Dinamik

Sementara pernyataan yang disediakan boleh digunakan untuk parameter dalam pertanyaan dinamik, struktur pertanyaan dinamik itu sendiri tidak boleh diparameterkan. Dalam kes ini, anda dinasihatkan untuk menggunakan penapis senarai putih.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Suntikan SQL dengan Berkesan dalam Aplikasi PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan