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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow