Pengenalan
Dalam pengaturcaraan SQL, menghantar nama jadual pembolehubah ke dalam prosedur tersimpan adalah cabaran biasa. Artikel ini meneroka batasan pertanyaan berparameter dan menyediakan penyelesaian yang boleh dipercayai yang selamat dan fleksibel.
Soalan
Secara tradisinya, pernyataan SQL dibina pada bahagian klien dan dihantar ke pangkalan data sebagai rentetan. Pendekatan ini terdedah kepada serangan suntikan SQL kerana input pengguna boleh dimanipulasi untuk melaksanakan arahan berniat jahat.
Pertanyaan berparameter
Untuk mengurangkan risiko suntikan SQL, pertanyaan berparameter diperkenalkan. Pertanyaan ini menggunakan ruang letak sebagai ganti input pengguna dan kemudian mengikat nilai sebenar apabila dilaksanakan. Ini menghalang kod berniat jahat daripada disuntik ke dalam pertanyaan.
Walau bagaimanapun, terdapat cabaran dengan pertanyaan berparameter apabila nama jadual adalah pembolehubah. SQL Dinamik (menjana teks pertanyaan pada masa jalan) sering digunakan untuk menyelesaikan masalah ini. Walau bagaimanapun, pendekatan ini boleh mengakibatkan kod yang kompleks dan mudah ralat.
Penyelesaian yang selamat dan fleksibel
Penyelesaian yang lebih selamat dan elegan ialah menggunakan prosedur tersimpan dengan SQL dinamik. Prosedur tersimpan mengambil input pengguna sebagai parameter dan menggunakannya untuk mencari nama jadual sebenar daripada sumber selamat (seperti jadual pangkalan data atau fail XML).
Contoh berikut menggambarkan pendekatan ini:
<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) SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' EXEC(@SQL) END</code>
Prosedur tersimpan ini mengambil nama jadual yang diluluskan, mencari nama jadual sebenar daripada jadual metadata INFORMATION_SCHEMA.TABLES, dan kemudian melaksanakan pertanyaan SQL dinamik untuk mengira bilangan baris dalam jadual sebenar.
Langkah Berjaga-jaga Keselamatan
Menggunakan pendekatan ini memberikan beberapa kelebihan keselamatan:
Nota lain
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memeteraikan Pertanyaan SQL dengan Nama Jadual Dinamik dengan Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!