Suche…


Führen Sie die als Zeichenfolge bereitgestellte SQL-Anweisung aus

In einigen Fällen müssen Sie eine SQL-Abfrage ausführen, die in einer Zeichenfolge platziert ist. EXEC, EXECUTE oder die Systemprozedur sp_executesql kann jede als String bereitgestellte SQL-Abfrage ausführen:

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')

Diese Prozedur gibt die gleiche Ergebnismenge zurück wie die SQL-Abfrage, die als Anweisungstext bereitgestellt wird. sp_executesql kann eine SQL-Abfrage ausführen, die als String-Literal, Variable / Parameter oder sogar als Ausdruck bereitgestellt wird:

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

Sie benötigen die Funktion QUOTENAME, um Sonderzeichen in der @ tabellenvariablen zu kennzeichnen. Ohne diese Funktion würden Sie einen Syntaxfehler erhalten, wenn die Variable @table etwas wie Leerzeichen, Klammern oder andere Sonderzeichen enthält.

Dynamic SQL wird als anderer Benutzer ausgeführt

Sie können die SQL-Abfrage als unterschiedlichen Benutzer mit AS USER = 'Name des Datenbankbenutzers' ausführen.

EXEC(N'SELECT * FROM product') AS USER = 'dbo'

Die SQL-Abfrage wird unter dbo-Datenbankbenutzer ausgeführt. Alle Berechtigungsprüfungen für den Dbo-Benutzer werden in der SQL-Abfrage geprüft.

SQL Injection mit dynamischem SQL

Dynamische Abfragen sind

SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)

Wenn der Wert der Benutzervariable myusername '' ODER 1 = 1 ist, wird die folgende Abfrage ausgeführt:

SELECT COUNT(*)
FROM AppUsers 
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''

Der Kommentar am Ende des Werts der Variablen @username wird am Ende der Abfrage auskommentiert und die Bedingung 1 = 1 wird ausgewertet. Anwendung, die überprüft, dass mindestens ein Benutzer, der von dieser Abfrage zurückgegeben wird, einen Wert größer als 0 zurückgibt und die Anmeldung erfolgreich ist.

Mit diesem Ansatz kann sich der Angreifer in die Anwendung einloggen, auch wenn er keinen gültigen Benutzernamen und kein gültiges Kennwort kennt.

Dynamisches SQL mit Parametern

Um Injection- und Escape-Probleme zu vermeiden, sollten dynamische SQL-Abfragen mit Parametern ausgeführt werden, z.

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

Der zweite Parameter ist eine Liste von Parametern, die in der Abfrage mit ihren Typen verwendet werden. Nach dieser Liste werden Variablen bereitgestellt, die als Parameterwerte verwendet werden.

sp_executesql gibt Sonderzeichen aus und führt eine SQL-Abfrage aus.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow