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

Mengizinkan pengguna untuk meneruskan nama tabel dan nama kolom sambil mencegah injeksi SQL

Inilah yang QUOTENAME() diciptakan untuk dipecahkan. Anda memasukkan nama kolom dan tabel sebagai parameter ke QUOTENAME() dan kemudian Anda menggunakan outputnya untuk mewakili objek dalam database Anda dalam kueri sql dinamis.

//The evil name tries to expliot code like:
//  set @sql = N'CREATE TABLE [' + @tablename + N'] (Foo int)'
var evilName = "someName] (Foo int); Drop table students --";

var query = @"
declare @sql as nvarchar(max)
set @sql = N'CREATE TABLE ' + QUOTENAME(@tablename) + N' (Foo int)'
exec sp_executesql @sql
";
using(var connection = new SqlConnection(ConnectionString))
using(var command = new SqlCommand(query, connection))
{
    command.Parameters.Add("@tablename", SqlDbType.NVarChar, 128).Value = evilName ;
    connection.Open();
    command.ExecuteNonQuery();
}

Query yang akan dieksekusi di server adalah

CREATE TABLE [someName]] (Foo int); Drop table students --] (Foo int)

yang membuat tabel dengan nama tabel yang valid dan tidak menghapus tabel saya yang lain.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Setara dengan GROUP_CONCAT()

  2. Ubah Pemisah menjadi Koma saat Mengirim Hasil Kueri melalui Email di SQL Server (T-SQL)

  3. 10 FAQ Teratas Tentang Pemantauan Kinerja SQL Server

  4. SQL Server Management Studio - cara mengubah jenis bidang tanpa menjatuhkan tabel

  5. ROUND() Contoh di SQL Server