2009-05-11 14 views
1

新しいSQL LOGINを追加し、個人のメールアドレスの後に名前を付けることができます。たとえば、「[email protected]」と入力します。これを次のストアドプロシージャに渡すとエラーが発生します(エラーは手順に従います)。SQLエンコード文字列パラメータのために特殊文字が使用される

ストアドプロシージャ:

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マネージャーウィザードでユーザーを追加すると、電子メールアドレスを指定できるので、有効なログイン名であることがわかります。

+0

警告注入警告:このルーチンにユーザーのパスワードを直接渡さないでください!ユーザーは '); DROP DATABASE DunderMifflin; - – BradC

答えて

2

あなたは角括弧で囲むことができるはず、as detailed here

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

+1のパスワードを入力することができます。これはパスワードが複雑ではない場合でも失敗する可能性があるため、戻り値を提供することをお勧めします。 – Andomar

+0

パスワードにアポストロフィがある場合、これは失敗します。 – BradC

+0

彼はすでにそれをエスケープしていなかったと仮定します。それは彼の質問の範囲外ですが、私の答えの中にその可能性を避けるための技術があります。 –

0

必須インジェクション警告: 何をするにしても、このルーチンに直接ユーザのパスワードを渡さないでください!

CREATE LOGIN [email protected] WITH PASSWORD = 'bill'); 
DROP DATABASE DunderMifflin; 
-- ''', DEFAULT_DATABASE = DunderMifflin') 

、それはよくないです:ユーザーが

bill');DROP DATABASE DunderMifflin;-- 

のパスワードを入力して、あなたは基本的に文を実行している場合はどう

+0

完全に同意し、この問題を認識しています。では、それを確保するために何をお勧めしますか? – Justin

+0

チャドによって提供されたリンクにはたくさんの提案があるようです。 – Justin

+0

はい、チャドのリンクには良い提案が含まれています。リスクを認識していない場合は、この脆弱性を最前線に持っていきたいと考えています。 – BradC

関連する問題