sql >> Database >  >> RDS >> Sqlserver

Een gebruiker toestaan ​​de tabelnaam en kolomnaam door te geven terwijl SQL-injectie wordt voorkomen

Dit is wat QUOTENAME() is gemaakt om op te lossen. U geeft uw kolom- en tabelnamen als parameters door aan QUOTENAME() en dan gebruik je de uitvoer ervan om objecten in je database weer te geven in een dynamische SQL-query.

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

De query die op de server wordt uitgevoerd, is

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

die een tabel aanmaakt met een geldige tafelnaam en mijn andere tafel niet laat vallen.




  1. Negeren zeer kleine MySQL-tabellen indexen?

  2. Is er een ingebouwde functie die getallen kan omzetten in woorden in de sql-server?

  3. postgresql kan INSERT-query niet openen als cursor

  4. verbinding maken met de database met behulp van RMySQL, R en MySQL