0

我在 PDW AU5 工作。我正在编写一个需要动态 SQL 的存储过程(因为数据库名称可变)。所以,为了防止 SQL 注入,我对存储过程的输入参数值做了一个简单的测试。如果测试失败,我想退出存储过程。通常在 SMP 上,我会使用 RETURN -1 执行此操作。但是,在 PDW 上的存储过程中不允许 RETURN。我怎样才能解决这个问题?

4

2 回答 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 回答