sql >> Databáze >  >> RDS >> Sqlserver

Umožnění uživateli předat název tabulky a název sloupce a zároveň zabránit vkládání SQL

Toto je QUOTENAME() byl vytvořen k řešení. Názvy sloupců a tabulek předáte jako parametry do QUOTENAME() a poté použijete jeho výstup k reprezentaci objektů ve vaší databázi v dynamickém dotazu 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();
}

Dotaz, který bude proveden na serveru, bude

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

který vytvoří tabulku s platným názvem tabulky a nezruší mou druhou tabulku.




  1. Chyba ALTER TYPE ve vztahu postgres neexistuje

  2. Sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)

  3. Mysql Kopírování databáze ze serveru na server jediným příkazem

  4. DB schéma řízení přístupu založeného na rolích