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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow