Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cho phép người dùng chuyển tên bảng và tên cột trong khi ngăn chặn việc đưa vào SQL

Đâ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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo hồ sơ thư cơ sở dữ liệu (SSMS)

  2. Không thể chèn null vào datetime trong máy chủ sql

  3. Hiệu suất máy chủ Sql và thứ tự các trường

  4. Tạo tên bảng là các từ / từ khóa dành riêng trong MS SQL Server

  5. Chọn một chỉ mục không gian SQL Server 2008 tốt với các đa giác lớn