यह है QUOTENAME()
हल करने के लिए बनाया गया था। आप अपने कॉलम और टेबल नामों को QUOTENAME()
. में पैरामीटर के रूप में पास करते हैं और फिर आप इसके आउटपुट का उपयोग गतिशील sql क्वेरी में अपने डेटाबेस में objecs का प्रतिनिधित्व करने के लिए करते हैं।
//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();
}
सर्वर पर निष्पादित की जाने वाली क्वेरी होगी
CREATE TABLE [someName]] (Foo int); Drop table students --] (Foo int)
जो एक मान्य तालिका नाम के साथ एक तालिका बनाता है और मेरी दूसरी तालिका को नहीं छोड़ता है।