【问题标题】:sp_executesql with OUTPUT Parameter on SET statementsp_executesql 与 SET 语句上的 OUTPUT 参数
【发布时间】:2020-11-19 06:11:11
【问题描述】:

我想用 sp_executesql 设置@email_bodysp_send_dbmail

为什么?

以前我将参数直接连接到@email_body,这很容易发生 SQL 注入。 像这样

SET @email_body = 'some html' + @id + 'some html' + @name + 'some html';

SQL 注入是可能的,因为我们无法控制输入。

我做了什么?

所以上面只是一个例子 我的查询看起来很像这样

DECLARE @sql NVARCHAR(MAX);
DECLARE @email_body VARCHAR(max);
DECLARE @ParamDef NVARCHAR(MAX);
DECLARE @id INT;
DECLARE @name NVARCHAR(MAX);
DECLARE @status NVARCHAR(MAX);

-- select statement to input have input in @id, @name and @status from sometable;

SET @sql = N'SET @email_bodyOUT = CASE @status  
                    WHEN ''A'' THEN ''SOME HTML'' + @id + ''SOME HTML'' + @name + ''SOME HTML'' 
                    WHEN ''B'' THEN ''SOME HTML'' + @id + ''SOME HTML'' + @name + ''SOME HTML'' 
                    WHEN ''C'' THEN ''SOME HTML'' + @id + ''SOME HTML'' + @name + ''SOME HTML'' END';

SET @ParamDef = N'@email_bodyOUT VARCHAR(MAX) OUTPUT
        , @status NVARCHAR(MAX)
        , @id INT
        , @name NVARCAHR(MAX)';

EXECUTE sp_executesql @sql 
            , @ParamDef
            , @email_bodyOUT = @email_body OUTPUT
            , @status = @status
            , @id = @id 
            , @name = @name;
SELECT @email_bodyOUT;
--executing sp_send_dbmail and send email

但是@email_body 中没有附加任何内容,并且邮件为空。 当我使用 sp_executesql 运行这样的简单查询时,它工作正常

 DECLARE @First_Name NVARCHAR(200) = 'abc';
 EXEC sp_executesql N'
         declare @HTML nvarchar(max) =  ''Hi'' + @FN + '' , Rest of HTML email :) :)  ''
         SELECT @HTML',
   N'@FN VARCHAR(8000)',
   @First_Name;

提前感谢您的帮助:)

【问题讨论】:

    标签: sql-injection sp-executesql sp-send-dbmail


    【解决方案1】:

    发现问题,是因为参数之一是Null,导致@emailbody为空。通过ISNULL 函数修复它。

    【讨论】:

      猜你喜欢
      • 2015-02-07
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多