У меня есть хранимая процедура, которая принимает имя таблицы в качестве параметра и использует динамический 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».