Ich habe eine gespeicherte Prozedur, die den Namen einer Tabelle als Parameter übernimmt und dynamisches SQL verwendet, um die Auswahl durchzuführen. Ich habe versucht, @TableName als Parameter übergeben und sp_executesql verwenden, aber das hat einen Fehler ausgelöst. Ich entschied mich, mit dynamischem sql ohne sp_executesql zu gehen.Wie sichere dynamische SQL gespeicherte Prozedur?
Gibt es noch etwas, was ich tun sollte, um den Parameter @TableName zu sichern, um SQL-Injection-Angriffe zu vermeiden?
Stored Procedure unter:
CREATE PROCEDURE dbo.SP_GetRecords
(
@TableName VARCHAR(128) = NULL
)
AS
BEGIN
/* Secure the @TableName Parameter */
SET @TableName = REPLACE(@TableName, ' ','')
SET @TableName = REPLACE(@TableName, ';','')
SET @TableName = REPLACE(@TableName, '''','')
DECLARE @query NVARCHAR(MAX)
/* Validation */
IF @TableName IS NULL
BEGIN
RETURN -1
END
SET @query = 'SELECT * FROM ' + @TableName
EXEC(@query)
END
Dies schlug fehl, wenn sp_executesql anstelle:
SET @query = 'SELECT * FROM @TableName'
EXEC sp_executesql @query, N'@TableName VARCHAR(128)', @TableName
ERROR: Must declare the table variable "@TableName".
Unabhängig davon, welche Lösung Sie sich entscheiden, sich bewusst sein, dass, wenn Sie dynamische SQL in einer gespeicherten Prozedur ausführen, dass SQL standardmäßig mit den Berechtigungen des gespeicherten proc * Anrufers *. Während normales SQL in einer gespeicherten Prozedur standardmäßig mit den Berechtigungen des gespeicherten proc * owner * ausgeführt wird. – RoadWarrior