Cara Mencegah Suntikan SQL di PHP

Cara Mencegah Suntikan SQL di PHP

Tutorial ini akan membantu anda untuk mengelakkan suntikan SQL dalam php. Dalam tutorial ini terlebih dahulu, periksa contoh asas proses suntikan SQL. Bagaimana pengguna boleh mencuri data dari laman web anda menggunakan suntikan SQL? Tutorial ini juga termasuk kaedah untuk mengelakkan suntikan SQL menggunakan pemacu php-mysqli dan php-pdo.

Contoh suntikan SQL sederhana

Contohnya, mempunyai laman web untuk bank. Anda telah menyediakan antara muka web kepada pelanggan bank untuk melihat nombor akaun dan baki mereka. Laman web bank anda menggunakan URL seperti http: // contoh.com/get_account_details.php?account_id = 102 untuk mengambil butiran dari pangkalan data.

Sebagai contoh get_account_details.php mempunyai kod seperti di bawah.

$ accountId = $ _get ['account_id']; $ query = "Pilih AccountNumber, Baki dari Akaun di mana AccountId = $ AccountID";
12$ accountId = $ _get ['account_id']; $ query = "pilih akaunNumber, baki dari akaun di mana accountId = $ accountId";

Pelanggan AccountID diluluskan melalui rentetan pertanyaan sebagai account_id. Seperti URL di atas, jika ID akaun pengguna 102 dan ia diluluskan dalam rentetan pertanyaan. Skrip PHP akan membuat pertanyaan seperti di bawah.

$ query = "Pilih akaunNumber, baki dari akaun di mana accountId = 102";
1$ query = "Pilih akaunNumber, baki dari akaun di mana accountId = 102";
Perincian yang diambil untuk akaun yang ditentukan.

Butiran akaun dan keseimbangan diambil untuk AccountID 102 dan diberikan kepada pelanggan seperti yang dipaparkan di Tangkapan Tangkapan di atas.

Mari, anggap satu lagi senario - pelanggan pintar lebih banyak telah meluluskan account_id sebagai 0 atau 1 = 1 dalam rentetan pertanyaan. Apa yang akan berlaku sekarang? Skrip PHP akan membuat pertanyaan seperti di bawah dan dilaksanakan pada pangkalan data.

$ query = "Pilih AkaunNumber, Baki dari Akaun di mana AccountId = 0 atau 1 = 1";
1$ query = "Pilih AkaunNumber, Baki dari Akaun di mana AccountId = 0 atau 1 = 1";
Butiran yang diambil untuk semua akaun

Lihat pertanyaan yang dibuat oleh skrip dan hasil yang dikembalikan oleh pangkalan data. Anda dapat melihat bahawa pertanyaan ini mengembalikan semua nombor akaun dan baki yang ada.

Ini dipanggil suntikan SQL. Ini adalah senario mudah, boleh ada beberapa kaedah untuk melakukan suntikan SQL. Tutorial di bawah akan membantu anda untuk mengelakkan suntikan SQL menggunakan pemacu php mysqli dan pemacu pdo php.

#1. Menggunakan Pemandu PHP-Mysqli

Anda boleh menggunakan penyataan pemacu php-mysqli yang disediakan untuk mengelakkan jenis suntikan SQL ini. Gunakan di bawah kod PHP yang akan menghalang suntikan SQL.

$ accountId = $ _get ['account_id']; jika ($ stmt = $ mysqli-> Sediakan ('pilih akaunNumber, baki dari akaun di mana accountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> Execute (); $ result = $ stmt-> get_result (); sementara ($ row = $ result-> fetch_assoc ()) // do sesuatu di sini $ stmt-> close ();
12345678910111213141516$ accountId = $ _get ['account_id']; jika ($ stmt = $ mysqli-> Sediakan ('pilih akaunNumber, baki dari akaun di mana accountId = ?')) $ stmt-> bind_param ("s", $ accountId); $ stmt-> Execute (); $ result = $ stmt-> get_result (); sementara ($ row = $ result-> fetch_assoc ()) // do sesuatu di sini $ stmt-> close ();

#2. Menggunakan Pemandu PHP-PDO

Anda boleh menggunakan PHP-PDO Sediakan penyataan untuk mengelakkan jenis suntikan SQL ini. Gunakan di bawah kod PHP yang akan menyelesaikan suntikan SQL di atas.

$ accountId = $ _get ['account_id']; jika ($ stmt = $ pdo-> menyediakan ('pilih akaunNumber, baki dari akaun di mana accountId =: accountId') $ stmt-> execute (array ('name' => $ name)); foreach ($ stmt as $ row) // do sesuatu di sini $ stmt-> close ();
123456789101112$ accountId = $ _get ['account_id']; jika ($ stmt = $ pdo-> menyediakan ('pilih akaunNumber, baki dari akaun di mana accountId =: accountId') $ stmt-> execute (array ('name' => $ name)); foreach ($ stmt as $ row) // do sesuatu di sini $ stmt-> close ();