Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk mengelakkan serangan suntikan SQL dalam PHP
Dalam aplikasi web, serangan suntikan SQL ialah kaedah serangan biasa. Ia mengambil kesempatan daripada kegagalan aplikasi untuk menapis atau menyekat input pengguna dan memasukkan pernyataan SQL yang berniat jahat ke dalam aplikasi, menyebabkan pangkalan data dikawal oleh penyerang dan mencuri data sensitif. Bagi pembangun PHP, cara berkesan mencegah serangan suntikan SQL adalah kemahiran yang mesti dikuasai.
Artikel ini akan memperkenalkan amalan terbaik untuk mencegah serangan suntikan SQL dalam PHP adalah disyorkan bahawa pembangun PHP mengikuti langkah berikut untuk melindungi aplikasi mereka.
1. Gunakan pernyataan yang disediakan
Pernyataan yang disediakan ialah amalan terbaik untuk mencegah serangan suntikan SQL dalam PHP. Ia mentakrifkan pemegang tempat parameter pernyataan SQL sebelum menghantar pernyataan pertanyaan SQL ke pangkalan data. Parameter dalam pertanyaan kemudiannya diikat dengan ruang letak dan dilaksanakan terhadap pangkalan data, dengan itu mengelakkan pernyataan SQL yang disuntik secara berniat jahat.
Berikut ialah contoh menggunakan pernyataan PDO yang disediakan untuk melaksanakan pertanyaan SQL:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $results = $stmt->fetchAll();
Dalam contoh ini, $pdo
ialah objek sambungan PDO dan $username
ialah pengguna yang memerlukan untuk menanyakan nama. Kaedah prepare()
mentakrifkan pernyataan pertanyaan yang disediakan dan menggunakan ruang letak ?
bukannya parameter. Kaedah execute()
mengikat parameter dalam pernyataan yang disediakan kepada pemegang tempat dan melaksanakan pertanyaan kepada pangkalan data. Akhir sekali, simpan hasil pertanyaan dalam pembolehubah $results
.
2. Gunakan pertanyaan berparameter
Pertanyaan berparameter ialah satu lagi amalan terbaik untuk menghalang serangan suntikan SQL dalam PHP. Sama seperti pernyataan yang disediakan, ia juga menggunakan ruang letak untuk menggantikan parameter pertanyaan yang diperlukan, tetapi ia secara eksplisit mentakrifkan ruang letak dalam pernyataan pertanyaan SQL.
Berikut ialah contoh melaksanakan pertanyaan SQL menggunakan pertanyaan berparameter mysqli:
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?"); $stmt->bind_param('s', $username); $stmt->execute(); $results = $stmt->get_result();
Dalam contoh ini, $mysqli
ialah objek sambungan mysqli dan $username
ialah pengguna yang perlu melaksanakan nama pertanyaan. Kaedah prepare()
mentakrifkan pernyataan berparameter bagi pertanyaan, menggunakan ruang letak ?
bukannya parameter. Kaedah bind_param()
mengikat pemegang tempat kepada $username
. Akhir sekali, panggil kaedah execute()
untuk melaksanakan pertanyaan, dan kaedah get_result()
untuk mendapatkan hasil pertanyaan.
Menggunakan kaedah pertanyaan berparameter, berbanding dengan kaedah pernyataan yang disediakan, anda perlu melakukan satu lagi langkah parameter mengikat, yang agak menyusahkan untuk digunakan. Walau bagaimanapun, pertanyaan berparameter adalah lebih fleksibel dan boleh mengendalikan beberapa pernyataan SQL yang kompleks dengan lebih baik.
3. Gunakan penapis
PHP mempunyai sejumlah besar fungsi penapis terbina dalam yang boleh digunakan untuk menapis dan mengesahkan nilai input. Menggunakan fungsi penapis yang sesuai, anda boleh memastikan bahawa nilai input mematuhi format atau spesifikasi tertentu dan menghalang nilai input daripada digunakan untuk serangan suntikan SQL.
Berikut ialah contoh penggunaan fungsi filter_input()
untuk menapis input pengguna:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
Dalam contoh ini, fungsi filter_input()
digunakan untuk menapis nama pengguna dan kata laluan yang dimasukkan oleh pengguna . Parameter pertama INPUT_POST
menentukan jenis input yang ditapis, yang di sini merujuk kepada permintaan POST. Parameter kedua username
dan password
ialah nama pembolehubah yang diluluskan dalam permintaan POST masing-masing. Parameter ketiga FILTER_SANITIZE_STRING
digunakan untuk menapis dan mengalih keluar semua aksara haram dan mengekalkan huruf dan nombor dalam rentetan.
Menggunakan penapis adalah bersamaan dengan lapisan pengesahan input pengguna pada klien Fungsi penapis yang berbeza boleh menapis pelbagai jenis input, yang boleh membantu pembangun mencegah serangan suntikan SQL dengan berkesan.
4. Hadkan kebenaran pengguna pangkalan data
Akhir sekali, pastikan pengguna pangkalan data hanya mempunyai kebenaran minimum untuk mengakses pangkalan data. Pengguna pangkalan data yang hanya mempunyai pengubahsuaian, sisipan, pemadaman dan kebenaran operasi lain tetapi tiada kebenaran pertanyaan dan pemilihan tidak akan dapat melaksanakan pertanyaan yang mengandungi arahan yang menyalahi undang-undang, dengan itu menghalang serangan suntikan SQL yang berniat jahat.
Ringkasnya, mencegah serangan suntikan SQL dalam PHP adalah penting. Dengan menggunakan pernyataan yang disediakan, pertanyaan berparameter, penapis dan menyekat kebenaran pengguna pangkalan data, pembangun boleh melindungi aplikasi mereka daripada serangan berniat jahat.
Atas ialah kandungan terperinci Bagaimana untuk mengelakkan serangan suntikan SQL dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!