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.