Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Melindungi Aplikasi PHP Terhadap Serangan Suntikan SQL

Melindungi Aplikasi PHP Terhadap Serangan Suntikan SQL

DDD
DDDasal
2024-09-14 06:23:361264semak imbas

Securing PHP Applications Against SQL Injection Attacks

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.

1. Memahami SQL Injection

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.

2. Gunakan Penyata Disediakan

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:

  1. Sambung ke Pangkalan Data:
   $conn = new mysqli("localhost", "username", "password", "database");

   if ($conn->connect_error) {
       die("Connection failed: " . $conn->connect_error);
   }
  1. Sediakan Penyata SQL:
   $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
  1. Parameter Ikatan:
   $stmt->bind_param("i", $user_id); // "i" indicates the type is integer
  1. Laksanakan Kenyataan:
   $user_id = $_GET['user_id'];
   $stmt->execute();
  1. Ambil Hasil:
   $result = $stmt->get_result();
   while ($row = $result->fetch_assoc()) {
       // Process results
   }
  1. Tutup Penyata dan Sambungan:
   $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();
?>

3. Gunakan PDO dengan Penyata Disediakan

Objek Data PHP (PDO) menawarkan perlindungan yang serupa terhadap suntikan SQL dan menyokong berbilang sistem pangkalan data.

Menggunakan PDO dengan Penyata Disediakan:

  1. Sambung ke Pangkalan Data:
   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());
   }
  1. Sediakan Penyata SQL:
   $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
  1. Ikat Parameter dan Laksanakan:
   $stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
   $user_id = $_GET['user_id'];
   $stmt->execute();
  1. Ambil Hasil:
   $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()); } ?>

4. Amalan Keselamatan Tambahan

  • Sanitize Input: Sentiasa bersihkan dan sahkan input pengguna untuk memastikan ia berada dalam format yang diharapkan.
  • Gunakan ORM: Pemeta Perkaitan Objek seperti Eloquent (Laravel) mengendalikan perlindungan suntikan SQL secara dalaman.
  • Hadkan Kebenaran Pangkalan Data: Gunakan prinsip keistimewaan paling sedikit untuk akaun pengguna pangkalan data.

5. Kesimpulan

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!

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