Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Разрешаване на потребител да предава име на таблица и име на колона, като същевременно предотвратява SQL инжектиране

Това е какво QUOTENAME() е създаден за решаване. Подавате имената на вашите колони и таблици като параметри в QUOTENAME() и след това използвате изхода от него, за да представите обекти във вашата база данни в динамична 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();
}

Заявката, която ще бъде изпълнена на сървъра, ще бъде

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

което създава таблица с валидно име на таблица и не премахва другата ми таблица.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да премахнете водещи и последващи знаци в SQL Server

  2. Разрешаване на потребител да предава име на таблица и име на колона, като същевременно предотвратява SQL инжектиране

  3. Как да съхранявам изображения в колона varbinary(max)?

  4. Добавете WHERE клаузи към SQL динамично / програмно

  5. SQL Server Невалидно име на колона след добавяне на нова колона