SQL Encode字符串参数使特殊字符起作用

时间:2009-05-11 22:19:06

标签: sql-server stored-procedures

我希望能够添加新的SQL LOGIN并在人员电子邮件地址后命名。例如“billg@example.com”。当我将此传递给以下存储过程时,我收到错误(错误遵循过程)。

存储过程:

CREATE PROCEDURE [Forms].[AddLogin]
    @Email nvarchar(2048),
    @TenantPassword nvarchar(2048)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    EXEC('CREATE LOGIN ' + @Email + ' WITH PASSWORD = ''' + @TenantPassword + ''', DEFAULT_DATABASE = DunderMifflin')
END

错误:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '.'.

我确定我需要做的就是以某种方式对参数进行编码。有帮助吗?如果我通过SQL Manager向导添加用户,我可以指定电子邮件地址,因此我知道它是有效的登录名。

2 个答案:

答案 0 :(得分:2)

你应该可以用方括号as detailed here包围它:

EXEC('CREATE LOGIN [' + @Email + '] WITH PASSWORD = ''' + @TenantPassword + ''', DEFAULT_DATABASE = DunderMifflin')

答案 1 :(得分:0)

强制注射警告: 无论你做什么,请不要将用户的密码直接传递给这个例程!!如果用户输入了

的密码该怎么办?
bill');DROP DATABASE DunderMifflin;--

然后你基本上执行声明:

CREATE LOGIN billg@microsoft.com WITH PASSWORD = 'bill');
DROP DATABASE DunderMifflin;
-- ''', DEFAULT_DATABASE = DunderMifflin')

那并不好。