我在 PDW AU5 工作。我正在编写一个需要动态 SQL 的存储过程(因为数据库名称可变)。所以,为了防止 SQL 注入,我对存储过程的输入参数值做了一个简单的测试。如果测试失败,我想退出存储过程。通常在 SMP 上,我会使用 RETURN -1 执行此操作。但是,在 PDW 上的存储过程中不允许 RETURN。我怎样才能解决这个问题?
问问题
581 次
2 回答
0
您可以尝试使用 QUOTENAME 函数对输入字符串中的单引号字符进行转义,以阻止动态 SQL 注入。
DECLARE @userfield VARCHAR(255) = 'abc'' ;SELECT 1; '
DECLARE @sql NVARCHAR(4000)
SET @sql = 'SELECT ' + QUOTENAME(@UserField, '''')
PRINT @sql
EXEC (@sql)
请参阅另一篇关于如何防止 SQL 注入的帖子 如何防止 SQL 注入
于 2016-05-19T03:49:50.500 回答
0
您需要将代码包装在 IF 语句周围,并在它应该被 RETURN编辑的部分中,只需确保不满足 IF 条件并且绕过整个代码块并进入存储过程的末尾。
例如
CREATE PROCEDURE dbo.uspDynamicSQL
( @UserField varchar(255) )
AS
IF CHARINDEX(@UserField) > 0 THEN
BEGIN
-- YOUR SQL CODE AS NORMAL
END;
它不漂亮,但它有效。
于 2016-05-19T03:46:17.513 回答