Microsoft SQL Server
Dynamisk SQL
Sök…
Kör SQL-sats som tillhandahålls som sträng
I vissa fall skulle du behöva köra SQL-fråga placerad i sträng. EXEC, EXECUTE eller system procedure sp_executesql kan köra alla SQL-frågor som tillhandahålls som sträng:
sp_executesql N'SELECT * FROM sys.objects'
-- or
sp_executesql @stmt = N'SELECT * FROM sys.objects'
-- or
EXEC sp_executesql N'SELECT * FROM sys.objects'
-- or
EXEC('SELECT * FROM sys.columns')
-- or
EXECUTE('SELECT * FROM sys.tables')
Den här proceduren kommer att returnera samma resultatset som SQL-fråga som anges som uttalande text. sp_executesql kan köra SQL-fråga som tillhandahålls som strängbokstav, variabel / parameter eller till och med uttryck:
declare @table nvarchar(40) = N'product items'
EXEC(N'SELECT * FROM ' + @table)
declare @sql nvarchar(40) = N'SELECT * FROM ' + QUOTENAME(@table);
EXEC sp_executesql @sql
Du behöver QUOTENAME-funktionen för att undgå specialtecken i variabeln @tabell. Utan denna funktion skulle du få syntaxfel om @tabellvariabeln innehåller något som mellanslag, parenteser eller något annat specialtecken.
Dynamisk SQL körs som olika användare
Du kan köra SQL-fråga som olika användare med AS USER = 'databasanvändarens namn'
EXEC(N'SELECT * FROM product') AS USER = 'dbo'
SQL-frågan kommer att köras under en databasanvändare. Alla behörighetskontroller som gäller för dbo-användare kommer att kontrolleras i SQL-frågan.
SQL-injektion med dynamisk SQL
Dynamiska frågor är
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)
Om användarvariabelns värde är myusname '' ELLER 1 = 1 - kommer följande fråga att köras:
SELECT COUNT(*)
FROM AppUsers
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''
Kommentar i slutet av värdet på variabel @ användarnamn kommer att kommentera efterföljande del av frågan och villkor 1 = 1 kommer att utvärderas. Applikation som kontrollerar det där minst en användare som returneras av denna fråga kommer att räkna tillbaka större än 0 och inloggningen lyckas.
Med den här metoden kan angriparen logga in i applikationen även om han inte känner till giltigt användarnamn och lösenord.
Dynamisk SQL med parametrar
För att undvika problem med injektion och undgå bör dynamiska SQL-frågor utföras med parametrar, t.ex.
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = @user AND Password = @pass
EXEC sp_executesql @sql, '@user nvarchar(50), @pass nvarchar(50)', @username, @password
Den andra parametern är en lista över parametrar som används i fråga med deras typer, efter att denna lista tillhandahålls variabler som kommer att användas som parametervärden.
sp_executesql kommer att undkomma specialtecken och köra sql-fråga.