2014-10-17 78 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