2
下面的代碼是不工作:創建sp_executesql的PROC SQL登錄
declare @pUserName nvarchar(50) = N'[test2]' ;
declare @pPassword nvarchar(50) = N'''123456''';
declare @QueryString as nvarchar(max);
declare @ParmDefinition as nvarchar(max);
SET @QueryString = N'CREATE LOGIN @dUserName WITH PASSWORD= @dpassword , DEFAULT_DATABASE=[Yerknain] ,DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
SET @ParmDefinition = N'@dUserName nvarchar(50) , @dpassword nvarchar(50)';
EXECUTE sp_executesql @QueryString, @ParmDefinition,
@dUserName = @pUserName,
@dpassword = @pPassword;
它拋出一個錯誤:
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '@dUserName'.
,但是當我把它改成如下:
declare @pUserName nvarchar(50) = N'test2' ;
declare @pPassword nvarchar(50) = N'123456';
declare @QueryString as nvarchar(max);
declare @ParmDefinition as nvarchar(max);
SET @QueryString = N'CREATE LOGIN [@dUserName] WITH PASSWORD= ''@dpassword'' , DEFAULT_DATABASE=[Yerknain] ,DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=ON, CHECK_POLICY=ON';
SET @ParmDefinition = N'@dUserName nvarchar(50) , @dpassword nvarchar(50)';
EXECUTE sp_executesql @QueryString, @ParmDefinition,
@dUserName = @pUserName,
@dpassword = @pPassword;
它正在工作,但不是註冊名爲「test2」的新用戶,而是使用名稱「@pUserName」註冊它。
有沒有什麼辦法可以解決這個問題sp_executesql
程序(不只是通過exec,我需要檢查一切)?
但通過這種方式,參數將不會被檢查,無論他們是否在確切的長度或類型,它只會把它放在那裏,而不檢查是?所以存在SQL注入的風險?或者從安全方面來說沒問題? –
@AlphasSupremum **(1)**通過在矩形括號之間放置用戶名,並用密碼中的兩個單引號('''')替換單引號(''')的任何實例,您將受到保護來自SQL注入攻擊。 **(2)**您無法使用參數創建登錄名,這就是爲什麼我的答案將字符串中的用戶名連接起來。不過,我不確定密碼是否可以作爲參數傳遞,你應該嘗試看看是否有效。無論如何,我寫的是安全的與SQL注入攻擊。 –
@AlphasSupremum我修改了我的答案以使用['QUOTENAME'](https://msdn.microsoft.com/nl-be/library/ms176114.aspx)函數,這是一個更好的防範SQL注入的功能案件。引用自己的名字通常不是一個好主意。 'QUOTENAME'函數總是能夠做到最好。 –