Quale funzione cita un identificatore in dynamic-sql con SQL Server?


11

Qual è il metodo SQL Server per identificare preventivamente gli identificativi per la generazione dinamica di sql.

Come posso garantire un nome di colonna generato dinamicamente per un'istruzione generata dinamicamente che la colonna stessa non è un attacco di iniezione SQL.

Diciamo che ho un'istruzione SQL,

SELECT [$col] FROM table;

che è essenzialmente lo stesso di

'SELECT [' + $col + '] FROM table;'

Ciò che ferma un attacco di iniezione dove

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";

Con il risultato di

SELECT [name] FROM sys.objects;
DROP TABLE my.accounts;
-- ] FROM table;

Risposte:


14

La funzione che stai cercando è QUOTENAME!

Attraverso l'uso pratico della tecnologia a parentesi quadra, è possibile incapsulare in modo sicuro stringhe per aiutare a prevenire attacchi di iniezione SQL caldi.

Tieni presente che il fatto di incollare parentesi quadre attorno a qualcosa non lo cita in modo sicuro, anche se puoi evitare errori di codice con caratteri non validi nei nomi degli oggetti.

Buon codice

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d

Codice errato

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d

Per fare un esempio specifico ...

Di seguito funziona bene per l'input iniziale

DECLARE @ObjectName SYSNAME = 'sysobjects';

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';

EXEC (@dynSql);

Ma con input dannosi è vulnerabile all'iniezione SQL

DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT  COUNT(*)  FROM [' + @ObjectName + ']';

EXEC (@dynSql);

L'uso QUOTENAMEcorretto evita l'incorporamento ]e impedisce che si verifichi il tentativo di iniezione SQL.

DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT  COUNT(*)  FROM ' + QUOTENAME(@ObjectName);

EXEC (@dynSql);

Nome oggetto non valido 'sysobjects]; SELECT' Questo è un codice arbitrario eseguito. Potrebbe aver eliminato una tabella o concesso autorizzazioni "-".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.