Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Menyalurkan Nama Jadual dengan Selamat kepada Prosedur Tersimpan untuk Mengelakkan Suntikan SQL?

Bagaimanakah Saya Boleh Menyalurkan Nama Jadual dengan Selamat kepada Prosedur Tersimpan untuk Mengelakkan Suntikan SQL?

Barbara Streisand
Lepaskan: 2025-01-15 12:18:46
asal
928 orang telah melayarinya

How Can I Safely Pass Table Names to Stored Procedures to Avoid SQL Injection?

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:

  1. Buat prosedur tersimpan berparameter:

    • Buat prosedur tersimpan yang menerima parameter nama jadual.
    • Janakan pertanyaan secara dinamik menggunakan nama jadual yang diluluskan semasa prosedur.
    • Pastikan anda mengesahkan nama jadual yang dihantar kepada senarai putih, atau gunakan carian untuk mengelakkan input berniat jahat.
  2. Jana SQL dinamik semasa proses:

    • Menggabungkan pernyataan SQL menggunakan nama jadual yang diluluskan dalam prosedur tersimpan.
    • Gunakan pernyataan EXECUTE SQL untuk melaksanakan SQL dinamik.

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>
Salin selepas log masuk

Kelebihan:

  • Keselamatan: Pendekatan ini menghalang serangan suntikan SQL dengan mengelakkan penggunaan rentetan yang diluluskan untuk pelaksanaan SQL dinamik.
  • Kejelasan: Pertanyaan berparameter membantu memastikan kod anda teratur dan mudah diselenggara.
  • Kecekapan: Prosedur tersimpan boleh dicache dan digunakan semula, meningkatkan prestasi berbanding SQL dinamik.

Nota lain:

  • QUOTENAME digunakan dalam contoh untuk memastikan bahawa aksara khas dalam nama jadual yang diluluskan dikeluarkan dengan betul.
  • Gunakan INFORMATION_SCHEMA untuk transformasi carian untuk mengesahkan nama jadual yang dimasukkan.
  • Jika perlu, nama lajur juga boleh dihantar secara dinamik menggunakan parameter SQL.

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan