Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menyalurkan Nama Jadual dengan Selamat kepada Prosedur Tersimpan untuk Mengelakkan Suntikan SQL?
Lepaskan nama jadual ke prosedur tersimpan
Dalam pengaturcaraan pangkalan data, selalunya perlu menulis pertanyaan yang merujuk jadual tertentu berdasarkan input pengguna. Pendekatan tradisional melibatkan membina pernyataan SQL secara dinamik dalam aplikasi klien, yang menimbulkan kebimbangan keselamatan dan secara amnya dianggap sebagai amalan buruk.
Sebaliknya, penyelesaian yang lebih bersih dan selamat adalah dengan menghantar nama jadual sebagai parameter kepada prosedur yang disimpan. Walau bagaimanapun, cabaran timbul apabila jadual sasaran berubah berdasarkan input pengguna.
Cabaran:
Dalam beberapa kes, jadual sasaran dipilih berdasarkan input pengguna. Contohnya, jika nilai input ialah "FOO" dan "BAR", pertanyaannya mungkin "SELECT * FROM FOO_BAR". Bagaimanakah kita boleh membuat parameter pertanyaan sedemikian untuk mengelakkan suntikan SQL dan menggunakan rentetan yang diluluskan untuk pelaksanaan SQL dinamik?
Penyelesaian:
Pendekatan yang disyorkan ialah menggunakan gabungan prosedur tersimpan berparameter dan SQL dinamik:
Buat prosedur tersimpan berparameter:
Jana SQL dinamik semasa proses:
Contoh prosedur tersimpan:
<code class="language-sql">CREATE PROC spCountAnyTableRows( @PassedTableName AS NVARCHAR(255) ) AS BEGIN DECLARE @ActualTableName AS NVARCHAR(255) SELECT @ActualTableName = QUOTENAME(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @PassedTableName DECLARE @sql AS NVARCHAR(MAX) SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC sp_executesql @sql END</code>
Kelebihan:
Nota lain:
Output yang disemak ini mengekalkan bahasa asal, mengelak daripada menukar makna, mengekalkan imej dalam format dan lokasi asalnya, dan menawarkan penjelasan yang disusun semula dan lebih ringkas Contoh SQL dipertingkatkan sedikit dengan menggunakan sp_executesql
yang secara amnya diutamakan untuk keselamatan dan pengendalian parameter yang lebih baik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyalurkan Nama Jadual dengan Selamat kepada Prosedur Tersimpan untuk Mengelakkan Suntikan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!