Microsoft SQL Server
Dynamische SQL
Zoeken…
Voer de SQL-instructie uit die als string wordt geleverd
In sommige gevallen moet u de SQL-query uitvoeren die in een string is geplaatst. EXEC, EXECUTE of systeemprocedure sp_executesql kan elke SQL-query uitvoeren die als string wordt aangeboden:
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')
Deze procedure retourneert dezelfde resultatenset als SQL-query die wordt geleverd als instructietekst. sp_executesql kan een SQL-query uitvoeren die wordt aangeboden als letterlijke tekenreeks, variabele / parameter of zelfs expressie:
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
U hebt de functie QUOTENAME nodig om te ontsnappen aan speciale tekens in de variabele @table. Zonder deze functie krijgt u een syntaxisfout als de variabele @table iets als spaties, haakjes of een ander speciaal teken bevat.
Dynamische SQL uitgevoerd als verschillende gebruiker
U kunt SQL-query uitvoeren als verschillende gebruiker met behulp van AS USER = 'naam van database-gebruiker'
EXEC(N'SELECT * FROM product') AS USER = 'dbo'
SQL-query wordt uitgevoerd onder DBO-database gebruiker. Alle toestemmingscontroles die van toepassing zijn op dbo-gebruiker worden gecontroleerd op SQL-query.
SQL-injectie met dynamische SQL
Dynamische zoekopdrachten zijn
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)
Als de waarde van de gebruikersvariabele mijngebruikersnaam '' OF 1 = 1 is - wordt de volgende query uitgevoerd:
SELECT COUNT(*)
FROM AppUsers
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''
Opmerking aan het einde van de waarde van variabele @gebruikersnaam zal een deel van de query achterlaten en voorwaarde 1 = 1 wordt geëvalueerd. Applicatie die het daar controleert, ten minste één gebruiker die door deze zoekopdracht wordt geretourneerd, zal het aantal groter dan 0 retourneren en inloggen zal slagen.
Met deze aanpak kan de aanvaller inloggen in de toepassing, zelfs als hij geen geldige gebruikersnaam en wachtwoord kent.
Dynamische SQL met parameters
Om injectie en ontsnappingsproblemen te voorkomen, moeten dynamische SQL-query's worden uitgevoerd met parameters, bijvoorbeeld:
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
Tweede parameter is een lijst met parameters die in de query met hun typen worden gebruikt, nadat deze lijst variabelen bevat die zullen worden gebruikt als parameterwaarden.
sp_executesql ontsnapt speciale tekens en voert een sql-query uit.