Menyekat serangan suntikan SQL adalah penting untuk mengekalkan keselamatan aplikasi PHP anda. Suntikan SQL ialah kelemahan yang membolehkan penyerang melaksanakan kod SQL sewenang-wenangnya pada pangkalan data anda, yang berpotensi membawa kepada pelanggaran atau kehilangan data. Berikut ialah panduan langkah demi langkah untuk mencegah serangan suntikan SQL dalam PHP, lengkap dengan contoh dan penerangan secara langsung.
Suntikan SQL berlaku apabila input pengguna disanitasi dengan tidak betul dan dimasukkan ke dalam pertanyaan SQL. Contohnya, jika pengguna memasukkan kod SQL berniat jahat, ia boleh memanipulasi pertanyaan anda untuk melakukan tindakan yang tidak diingini.
Contoh SQL Injection:
// Vulnerable Code $user_id = $_GET['user_id']; $query = "SELECT * FROM users WHERE id = $user_id"; $result = mysqli_query($conn, $query);
Jika user_id ditetapkan kepada 1 ATAU 1=1, pertanyaan menjadi:
SELECT * FROM users WHERE id = 1 OR 1=1
Pertanyaan ini akan mengembalikan semua baris daripada jadual pengguna kerana 1=1 sentiasa benar.
Pernyataan yang disediakan adalah pertahanan utama terhadap suntikan SQL. Mereka memisahkan logik SQL daripada data dan memastikan input pengguna dianggap sebagai data dan bukannya kod boleh laku.
Menggunakan MySQLi dengan Penyata Disediakan:
$conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id); // "i" indicates the type is integer
$user_id = $_GET['user_id']; $stmt->execute();
$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Process results }
$stmt->close(); $conn->close();
Contoh Lengkap:
<?php // Database connection $conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Prepare statement $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); if ($stmt === false) { die("Prepare failed: " . $conn->error); } // Bind parameters $user_id = $_GET['user_id']; $stmt->bind_param("i", $user_id); // Execute statement $stmt->execute(); // Get results $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; } // Close statement and connection $stmt->close(); $conn->close(); ?>
Objek Data PHP (PDO) menawarkan perlindungan yang serupa terhadap suntikan SQL dan menyokong berbilang sistem pangkalan data.
Menggunakan PDO dengan Penyata Disediakan:
try { $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); }
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT); $user_id = $_GET['user_id']; $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; }
Contoh Lengkap:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Prepare statement $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); // Bind parameters $user_id = $_GET['user_id']; $stmt->bindParam(':id', $user_id, PDO::PARAM_INT); // Execute statement $stmt->execute(); // Fetch results $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "
"; echo "User Name: " . $row['name'] . "
"; } } catch (PDOException $e) { die("Error: " . $e->getMessage()); } ?>
Menyekat serangan suntikan SQL adalah penting untuk melindungi aplikasi PHP anda. Dengan menggunakan pernyataan yang disediakan dengan MySQLi atau PDO, anda memastikan bahawa input pengguna dikendalikan dengan selamat dan tidak dilaksanakan sebagai sebahagian daripada pertanyaan SQL anda. Mengikuti amalan terbaik ini akan membantu melindungi aplikasi anda daripada salah satu kelemahan web yang paling biasa.
Atas ialah kandungan terperinci Melindungi Aplikasi PHP Terhadap Serangan Suntikan SQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!