Pengaturcaraan selamat dengan PHP: suntikan dan pertahanan SQL
Kini, Internet sedang berkembang pesat dan tapak web serta aplikasi menjadi semakin popular. Bersama-sama dengan ini datang ancaman keselamatan yang semakin meningkat. Salah satu kaedah serangan yang paling biasa ialah suntikan SQL. Serangan suntikan SQL menggunakan data input untuk mengubah suai atau mengusik arahan SQL, dan kemudian mengakses, mengubah suai dan memadamkan kandungan pangkalan data bahagian belakang. Artikel ini akan memperkenalkan prinsip dan langkah pertahanan serangan suntikan SQL, dan cara melaksanakan pengaturcaraan selamat dalam PHP.
Prinsip serangan suntikan SQL:
Prinsip serangan suntikan SQL adalah sangat mudah: penyerang menimpa data asal dengan data berniat jahat yang berniat jahat, dengan itu mengganggu dan memusnahkan proses pemprosesan data. Memandangkan pertanyaan SQL biasanya dibina oleh atur cara berdasarkan data yang dimasukkan oleh pengguna, penyerang boleh menambah aksara khas pada input untuk mengubah suai pertanyaan kepada hasil yang diingini oleh penyerang.
Berikut ialah contoh kod mudah:
$user = $_POST['user']; $password = $_POST['password']; //查询用户是否存在 $sql = "SELECT * FROM users WHERE username='$user' AND password='$password'"; $result = mysqli_query($conn, $sql);
Jika penyerang memasukkan kod berikut:
' OR '1'='1
, pernyataan pertanyaan SQL yang dibina akan menjadi:
SELECT * FROM users WHERE username='' OR '1'='1' AND password=''
Ini akan menyebabkan pernyataan pertanyaan sentiasa mengembalikan nilai sebenar, membenarkan penyerang memintas pengesahan dan akses, mengubah suai atau memadam kandungan pangkalan data.
Langkah pertahanan:
Terdapat banyak cara untuk bertahan terhadap serangan suntikan SQL Berikut adalah beberapa langkah yang biasa digunakan:
Pernyataan yang disediakan ialah cara yang berkesan untuk menghalang serangan suntikan SQL. Ia menggunakan ruang letak untuk menggantikan pembolehubah dalam pernyataan pertanyaan ini secara automatik dilepaskan oleh program dan data diperiksa.
Berikut ialah kod sampel menggunakan pernyataan yang disediakan:
$user = $_POST['user']; $password = $_POST['password']; //使用预处理语句查询用户是否存在 $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $user, $password); $stmt->execute(); $result = $stmt->get_result();
Sebelum membaca dan memanipulasi data input pengguna, Ia mesti ditapis dan disahkan. Anda boleh menggunakan fungsi terbina dalam PHP untuk menapis input pengguna, seperti htmlspecialchars() atau mysqli_real_escape_string().
Berikut ialah contoh kod yang menggunakan fungsi mysqli_real_escape_string() untuk menapis input pengguna:
$user = mysqli_real_escape_string($conn, $_POST['user']); $password = mysqli_real_escape_string($conn, $_POST['password']); //查询用户是否存在 $sql = "SELECT * FROM users WHERE username='$user' AND password='$password'"; $result = mysqli_query($conn, $sql);
Kurangkan apa yang pengguna perlu memasukkan Data boleh mengurangkan risiko serangan suntikan SQL. Anda boleh menggunakan nilai lalai borang, menu lungsur, butang radio, dsb. untuk mengurangkan input pengguna, dan anda juga boleh mengehadkan panjang input pengguna.
Dalam aplikasi praktikal, adalah disyorkan untuk tidak menggunakan fungsi berkaitan pangkalan data untuk menapis atau mengesahkan data input pengguna. Kerana fungsi ini mungkin gagal disebabkan oleh kunci pangkalan data atau isu lain, yang membawa kepada kelemahan keselamatan.
Kesimpulan:
Serangan suntikan SQL ialah kaedah serangan rangkaian biasa yang boleh menyebabkan akibat yang serius dalam tempoh yang singkat. Walau bagaimanapun, serangan suntikan SQL boleh dipertahankan dengan berkesan dengan menggunakan pernyataan yang disediakan, menapis input pengguna dan meminimumkan input pengguna. Kekal selamat dalam talian dengan sentiasa berwaspada dan sentiasa mengemas kini pengetahuan anda.
Atas ialah kandungan terperinci PHP melaksanakan pengaturcaraan selamat: suntikan dan pertahanan SQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!