Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara membersihkan (mencegah injeksi SQL) SQL dinamis di SQL Server?

Saya yakin ada tiga kasus berbeda yang harus Anda khawatirkan:

  • string (apa pun yang memerlukan tanda kutip):'''' + replace(@string, '''', '''''') + ''''
  • nama (apa pun yang tidak diperbolehkan tanda kutip):quotename(@string)
  • hal-hal yang tidak dapat dikutip:ini memerlukan daftar putih

Catatan :Semuanya dalam variabel string (char , varchar , nchar , nvarchar , dll.) yang berasal dari sumber yang dikontrol pengguna harus menggunakan salah satu metode di atas. Artinya, bahkan hal-hal yang Anda harapkan berupa angka akan dikutip jika disimpan dalam variabel string.

Untuk detail selengkapnya, lihat Microsoft Magazine (Tautan usang:19-10-2016) .

Berikut ini contoh menggunakan ketiga metode tersebut:

EXEC 'SELECT * FROM Employee WHERE Salary > ''' +
     REPLACE(@salary, '''', '''''') +   -- replacing quotes even for numeric data
     ''' ORDER BY ' + QUOTENAME(@sort_col) + ' ' +  -- quoting a name
     CASE @sort_dir WHEN 'DESC' THEN 'DESC' END     -- whitelisting

Perhatikan juga bahwa dengan melakukan semua operasi string sebaris di EXEC pernyataan tidak ada kekhawatiran dengan masalah pemotongan. Jika Anda menetapkan hasil antara ke variabel, Anda harus pastikan bahwa variabel cukup besar untuk menampung hasil. Jika Anda melakukan SET @result = QUOTENAME(@name) anda harus mendefinisikan @result untuk menampung setidaknya 258 (2 * 128 + 2) karakter. Jika Anda melakukan SET @result = REPLACE(@str, '''', '''''') anda harus mendefinisikan @result menjadi dua kali ukuran @str (anggap setiap karakter dalam @str bisa berupa kutipan). Dan tentu saja, variabel string yang menyimpan pernyataan SQL akhir harus cukup besar untuk menampung semua SQL statis ditambah semua variabel hasil.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengembalikan Daftar Tipe Data di SQL Server (T-SQL)

  2. Kelompokkan DateTime menjadi interval 5,15,30 dan 60 menit

  3. Cara memperbarui baris dengan tanggal acak

  4. Cari Tahu apakah Objek adalah Fungsi Bernilai Tabel di SQL Server dengan OBJECTPROPERTY()

  5. Mengapa cast/convert dari int mengembalikan tanda bintang