sql - 如何保证动态SQL存储过程的安全?

标签 sql stored-procedures sql-injection dynamic-sql

我有一个存储过程,它接受表名作为参数,并使用动态 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/

相关文章:

sql - 是否直接执行SQL错误的应用程序设计?

php - 我可以通过将整个 MySQL 查询作为参数传递来使用 mysql_real_escape_string 函数吗?

php - 网站发现SQL注入(inject)漏洞

sql-server - 在 R 中执行 SQL Server 存储过程

mysql - 为sql结果添加前缀

sql - PostgreSQL 插入并忽略多列

sql - redshift array_to_string 不适用于 union

sql-server - SQL、While 循环、递归存储过程或游标哪个更快?

php - php中每个数据库扩展的字符串是如何转义的?

java - hibernate 无故插入