2009-05-11 4 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

필수 주입 경고 : 무슨 일이 있어도,이 루틴에 직접 사용자의 암호를 전달하지 마십시오! 사용자는

bill');DROP DATABASE DunderMifflin;-- 

의 암호를 입력 한 후, 당신은 기본적으로 문 실행되는 경우는 어떻게 :

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

을하고는 좋지 않다.

+0

이 문제에 완전히 동의하며이를 알고 있습니다. 그래서 그것을 확보하기 위해 당신은 무엇을 제안합니까? – Justin

+0

실제로 Chad가 제공 한 링크에는 많은 제안이있는 것처럼 보입니다. – Justin

+0

예, Chad의 링크에는 좋은 제안이 포함되어 있습니다. 위험을 이미 알고 있지 않은 경우이 취약점을 최전방으로 가져 가고 싶었습니다. – BradC