Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Umożliwienie użytkownikowi przekazywania nazwy tabeli i nazwy kolumny przy jednoczesnym zapobieganiu wstrzykiwaniu SQL

To właśnie QUOTENAME() został stworzony do rozwiązania. Przekazujesz nazwy kolumn i tabel jako parametry do QUOTENAME() a następnie użyj jej wyjścia do reprezentowania obiektów w Twojej bazie danych w dynamicznym zapytaniu sql.

//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();
}

Zapytanie, które zostanie wykonane na serwerze to

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

który tworzy tabelę z prawidłową nazwą tabeli i nie usuwa mojej drugiej tabeli.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustawienie limitu czasu dla SQL Server

  2. Błąd SQL Server:ExecuteNonQuery:Właściwość połączenia nie została zainicjowana

  3. Zapytanie krzyżowe z dynamicznymi kolumnami w SQL Server 2005 do góry

  4. Jak podsumować pole czasu w SQL Server

  5. Partycjonowanie tabeli przy użyciu 2 kolumn