Đây là nội dung QUOTENAME()
đã được tạo ra để giải quyết. Bạn chuyển tên cột và bảng của mình dưới dạng tham số vào QUOTENAME()
và sau đó bạn sử dụng đầu ra của nó để đại diện cho các đối tượng trong cơ sở dữ liệu của bạn trong một truy vấn sql động.
//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();
}
Truy vấn sẽ được thực thi trên máy chủ sẽ là
CREATE TABLE [someName]] (Foo int); Drop table students --] (Foo int)
tạo một bảng có tên bảng hợp lệ và không làm rơi bảng khác của tôi.