sql >> Database teknologi >  >> RDS >> Sqlserver

Tillader en bruger at videregive tabelnavn og kolonnenavn, mens SQL-injektion forhindres

Dette er hvad QUOTENAME() blev skabt til at løse. Du sender dine kolonne- og tabelnavne som parametre til QUOTENAME() og så bruger du outputtet af det til at repræsentere objekter i din database i en dynamisk sql-forespørgsel.

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

Forespørgslen, der vil blive udført på serveren, vil være

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

som opretter en tabel med et gyldigt tabelnavn og ikke taber min anden tabel.




  1. Udførelse af en lagret procedure med markør i PHP

  2. Sådan forbinder du arrays med MySQL fra 3 tabeller med mange-til-mange-forhold

  3. Hvilken forespørgsel ville jeg bruge til at få søskendeposter, når jeg bruger lukketabeller?

  4. Sådan løses Metode org.postgresql.jdbc.PgConnection.createBlob() er endnu ikke implementeret