У меня есть хранимая процедура, которая принимает имя таблицы в качестве параметра и использует динамический sql для выполнения выбора. Я пытался передать @TableName в качестве параметра и использовать sp_executesql, но это привело к ошибке. Я решил пойти с прямым динамическим SQL без использования sp_executesql.
Что еще я должен сделать, чтобы защитить параметр @TableName, чтобы избежать атак SQL-инъекций?
Хранимая процедура ниже:
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
Ошибка при использовании sp_executesql вместо:
SET @query = 'SELECT * FROM @TableName'
EXEC sp_executesql @query, N'@TableName VARCHAR(128)', @TableName
ОШИБКА: необходимо объявить переменную таблицы
"@TableName".