sql >> Databasteknik >  >> RDS >> Sqlserver

Tillåter en användare att skicka tabellnamn och kolumnnamn samtidigt som SQL-injektion förhindras

Detta är vad QUOTENAME() skapades för att lösa. Du skickar in dina kolumn- och tabellnamn som parametrar till QUOTENAME() och sedan använder du utdata från den för att representera objekt i din databas i en dynamisk SQL-fråga.

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

Frågan som kommer att köras på servern kommer att vara

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

som skapar en tabell med ett giltigt tabellnamn och inte släpper min andra tabell.




  1. Kan jag använda en ström för att INFOGA eller UPPDATERA en rad i SQL Server (C#)?

  2. Infoga html-kod i en mysql-tabell

  3. Är det möjligt att optimera frågan med hjälp av EXISTS istället för IN-satsen med DISTINCT

  4. TypeORM-array stöds inte i postgres?