2014-10-17 85 views
0

上按照我的存儲過程檢查多個條件SQL Server 2008中

ALTER PROCEDURE [dbo].[Proc_userlogin] @userid VARCHAR(50), 
             @password VARCHAR(50) 
AS 
    DECLARE @ReturnVal VARCHAR(500) 

    SET nocount ON 

    IF EXISTS(SELECT username, 
        password 
       FROM clients 
       WHERE username = @userid 
        AND password = Hashbytes('SHA1', @password)) 
     SET @ReturnVal='0|Logged in Successfully' 
    ELSE IF NOT EXISTS(SELECT username 
        FROM clients 
        WHERE username = @userid) 
     SET @ReturnVal='1|Incorrect Username' 
    ELSE IF NOT EXISTS(SELECT username, 
         password 
        FROM clients 
        WHERE username = @userid 
         AND password = Hashbytes('SHA1', @password)) 
     SET @ReturnVal='1|Incorrect Password' 

    SELECT @ReturnVal 

在上面的存儲過程我檢查是否用戶名和密碼已經輸入了我面臨correctly.The問題是檢查多個條件。可以消除多個選擇查詢,並使用If條件中的單選查詢來檢查驗證。可以定製上述存儲過程以最大限度地減少條件內的選擇語句的數量。

請建議

感謝

+1

只檢查成功(即只有第一個)。爲什麼告訴攻擊者他猜對了一個有效的用戶名?你也可能泄露個人數據,因爲任何人都可以知道用戶名是否在你的系統中。 – adrianm 2014-10-17 07:49:37

+0

你是對的@adrianm,但我的用戶不會那麼複雜 – user2614235 2014-10-17 07:52:40

+0

在大多數情況下,我發現遵循最佳實踐比花費時間記錄給我的客戶爲什麼我沒有更容易。 (您確實告訴您的客戶有關當前代碼中已知的安全/隱私問題?) – adrianm 2014-10-17 09:45:29

回答

0

我優化您的SQL代碼如下:

ALTER PROCEDURE [dbo].[Proc_userlogin] @userid VARCHAR(50), 
             @password VARCHAR(50) 
AS 
    SET nocount ON 

    DECLARE @ReturnVal VARCHAR(500) 
    DECLARE @Password VARCHAR(50) 
    SET @Password = NULL 

    SELECT @Password = password 
    FROM clients 
    WHERE username = @userid 

    IF (@Password IS NULL) 
     SET @ReturnVal='1|Incorrect Username' 
    ELSE IF (@Password = Hashbytes('SHA1', @password)) 
     SET @ReturnVal='0|Logged in Successfully' 
    ELSE 
     SET @ReturnVal='1|Incorrect Password' 

    SELECT @ReturnVal 
+0

感謝您的回覆。如果用戶名和密碼都不正確,那麼? – user2614235 2014-10-17 07:48:39

+0

它是第一個條件** IF(@Password IS NULL)**。因爲用戶名不存在所以** @密碼**爲空 – 2014-10-17 07:50:30

+0

獲取此錯誤 消息139,級別15,狀態1,過程Proc_UserLogin,行0 無法將默認值分配給本地變量。 – user2614235 2014-10-17 09:08:12

0

感謝@Mohammad您的解決方案的工作,但有一些修改

ALTER procedure [dbo].[Proc_CheckUser] 
@userid VARCHAR(50), 
@password VARCHAR(50) 
AS 
    SET nocount ON 

    DECLARE @ReturnVal VARCHAR(500) 
    DECLARE @PasswordOld VARCHAR(50) 

    SELECT @PasswordOld = password 
    FROM Clients 
    WHERE username = @userid 

    IF (@PasswordOld IS NULL) 
     SET @ReturnVal='1|Incorrect Username' 
    ELSE IF (@PasswordOld = Hashbytes('SHA1', @password)) 
     SET @ReturnVal='0|Logged in Successfully' 
    ELSE 
     SET @ReturnVal='2|Incorrect Password' 

SELECT @ReturnVal