Cara mencegah injeksi SQL di PHP

Cara mencegah injeksi SQL di PHP

Tutorial ini akan membantu Anda mencegah SQL suntikan di PHP. Dalam tutorial ini terlebih dahulu, periksa contoh dasar proses injeksi SQL. Bagaimana cara pengguna dapat mencuri data dari situs web Anda menggunakan injeksi SQL? Tutorial ini juga mencakup metode untuk mencegah injeksi SQL menggunakan driver PHP-MYSQLI dan PHP-PDO.

Contoh injeksi SQL sederhana

Misalnya, memiliki situs web untuk bank. Anda telah menyediakan antarmuka web kepada pelanggan bank untuk melihat nomor rekening dan saldo mereka. Situs web bank Anda menggunakan URL seperti http: // contoh.com/get_account_details.php?Account_id = 102 untuk mengambil detail dari database.

Misalnya get_account_details.php memiliki kode sesuatu seperti di bawah ini.

$ accountId = $ _get ['account_id']; $ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = $ accountId";
12$ accountId = $ _get ['account_id']; $ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = $ AccountId";

Customer AccountId dilewatkan melalui string kueri sebagai account_id. Seperti URL di atas, jika ID Akun Pengguna 102 dan lewat di string kueri. Skrip PHP akan membuat kueri seperti di bawah ini.

$ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = 102";
1$ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = 102";
Detail yang diambil untuk akun tertentu.

Rincian AccountNumber dan Saldo diambil untuk AccountID 102 dan diberikan kepada pelanggan seperti yang ditampilkan di tangkapan layar di atas.

Mari, asumsikan skenario lain - pelanggan yang lebih pintar telah lulus akun_id sebagai 0 atau 1 = 1 dalam string kueri. Apa yang akan terjadi sekarang? Skrip PHP akan membuat kueri seperti di bawah ini dan dieksekusi pada database.

$ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = 0 atau 1 = 1";
1$ query = "Pilih AccountNumber, saldo dari akun di mana AccountId = 0 atau 1 = 1";
Detail diambil untuk semua akun

Lihatlah kueri yang dibuat berdasarkan skrip dan hasilnya dikembalikan oleh database. Anda dapat melihat bahwa kueri ini mengembalikan semua nomor akun dan saldo yang tersedia.

Ini disebut injeksi SQL. Ini adalah skenario sederhana, mungkin ada sejumlah metode untuk melakukan suntikan SQL. Tutorial di bawah ini akan membantu Anda mencegah injeksi SQL menggunakan pengemudi php mysqli dan pengemudi php pdo.

#1. Menggunakan driver PHP-MYSQLI

Anda dapat menggunakan pernyataan disiapkan driver php-mysqli untuk menghindari jenis suntikan SQL ini. Gunakan di bawah kode PHP yang akan mencegah injeksi SQL.

$ accountId = $ _get ['account_id']; if ($ stmt = $ mysqli-> persiapan ('pilih AccountNumber, saldo dari akun di mana AccountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // lakukan sesuatu di sini $ stmt-> tutup ();
12345678910111213141516$ accountId = $ _get ['account_id']; if ($ stmt = $ mysqli-> persiapan ('pilih AccountNumber, saldo dari akun di mana AccountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // lakukan sesuatu di sini $ stmt-> tutup ();

#2. Menggunakan driver PHP-PDO

Anda dapat menggunakan pernyataan persiapan driver php-pdo untuk menghindari jenis suntikan SQL ini. Gunakan Kode PHP di bawah yang akan diselesaikan di atas suntikan SQL.

$ accountId = $ _get ['account_id']; if ($ stmt = $ pdo-> persiapan ('pilih AccountNumber, saldo dari akun di mana accountId =: accountId')) $ stmt-> execute (array ('name' => $ name))); foreach ($ stmt as $ row) // lakukan sesuatu di sini $ stmt-> tutup ();
123456789101112$ accountId = $ _get ['account_id']; if ($ stmt = $ pdo-> persiapan ('pilih AccountNumber, saldo dari akun di mana accountId =: accountId')) $ stmt-> execute (array ('name' => $ name))); foreach ($ stmt as $ row) // lakukan sesuatu di sini $ stmt-> tutup ();