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

Melindungi Aplikasi PHP Terhadap Serangan Suntikan SQL

DDD
Lepaskan: 2024-09-14 06:23:36
asal
1296 orang telah melayarinya

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);
Salin selepas log masuk

Jika user_id ditetapkan kepada 1 ATAU 1=1, pertanyaan menjadi:

SELECT * FROM users WHERE id = 1 OR 1=1
Salin selepas log masuk

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

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();
?>
Salin selepas log masuk

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

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()); } ?>
Salin selepas log masuk

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!

sumber:dev.to
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan