我有一个存储过程,它接受表名作为参数,并使用动态 sql 来执行选择。我尝试将 @TableName 作为参数传递并使用 sp_executesql,但这引发了错误。我决定直接使用动态 sql,而不使用 sp_executesql。
我还应该采取其他措施来保护 @TableName 参数以避免 SQL 注入(inject)攻击吗?
存储过程如下:
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
ERROR: Must declare the table variable "@TableName".
最佳答案
关于sql - 如何保证动态SQL存储过程的安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4671897/