2011-09-28 95 views
0

这个问题有更多的关于我如何设置我的服务器端代码为一个简单的登录脚本。我对实现我的目标的最佳方式感兴趣,当然这是为了针对数据库验证用户用户名和密码,并向他们提供成功的登录名,注册页面或找到的用户名或密码,但替代方案是错的。登录服务器端逻辑

现在,我把它建立在我的sql查询扫描数据库的用户和传递:

SELECT * FROM test WHERE userName='" + userName + "' AND pass='" + password + "'" 

问题的这种做法,要么返回一个true或false ......我不能告诉其中一个输入是否正确,另一个不正确。它要么找到记录,要么没有。

因此,我可以基于用户名进行查询,如果发现,请在将用户传递给成功登录之前检查记录是否有正确的密码。这样我知道密码是否是错误的,但我不知道密码是否正确,用户只是输入错误的用户名。

另外,我可以扩展,如果没有找到用户,请根据密码重新查询数据库,并确定是否可以找到记录但用户名不匹配。这似乎与数据库来回很多,这很好。但我想听取一些专家的意见,看这是否是一种正确的方法。

+1

我没有看到单独的查询密码的地步。不应该阻止多个用户选择相同的密码。从安全的角度来看,您永远不会希望向用户反馈说“该密码已被使用”。 –

+1

在处理登录失败时提供太多信息通常被认为是不好的做法 - 它为黑客提供了可用来渗透系统的信息。 查看hotmail或google邮件上的用户流量,了解目前可接受的方式。告诉黑客,他们得到了正确的用户名,但错误的密码告诉他们继续尝试不同的密码;告诉他们他们有一个有效的密码,但没有正确的用户名允许他们测试普通密码(神,性别和密码,根据民间传说)的存在..) –

+0

有道理。这是我正在寻找的反馈。谢谢。根据您的反馈意见,我目前正在采取这种方式,采用适当的方法? – ryandlf

回答

0

你不想太多的信息透露给人们不好的意图试图探测你的系统可用的用户名(甚至是 - 上帝保佑 - 正在使用的密码)。

当登录尝试失败,简单地显示一个消息,指出:

用户名和/或口令不匹配。

另外,在使用数据库时,请使用prepared statements,而不是字符串连接;它可以保护您免受SQL注入攻击。 Plus - 尽管从代码片段中不完全清楚 - 不要存储普通密码或纯密码哈希值。依靠许多可用且经过良好测试的加密/哈希库中的一个PHP's crypt function(确保你选择了合适的散列函数,如SHA512)。然后

您以最简单的形式代码应该是这样的:

// coming from your login page 
$dbh = new PDO(…); 
$sth = $dbh->prepare('SELECT `digest` FROM `users` WHERE `name` = :name LIMIT 1'); 
$sth->prepare(array(':name' => $_POST['username'])); 
$result = $sth->fetch(); 

if($result !== FALSE && crypt($_POST['password'], $result['digest']) === $result['digest']) { 
    printf('You logged in successfully as %s', htmlspecialchars($_POST['username'])); 
} else { 
    echo 'Sorry, username and/or password did not match! Please try again.'; 
    sleep(1); 
    exit; 
} 
1

我没有太多的想法,我的sql或不支持存储过程。如果支持,那么你可以用这种方法让SP检查所有的情况。下面是MSSQL的代码,你可以用我的SQL检查:

IF EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name AND [password] = @password) 
BEGIN 
    SELECT 1 AS RETURNVAL --Valid User   
END 
ELSE IF NOT EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name) 
BEGIN 
    SELECT 0 AS RETURNVAL -- User doesn't exist 
END 
ELSE 
BEGIN 
    SELECT -1 AS RETURNVAL -- Password Not Correct 
END 
+0

我正在使用mysql,最后我知道,存储过程不被支持,但可能已经改变了。我得看看它。编辑:它看起来像存储过程是支持的,所以我会给你的查询一试。 – ryandlf

+0

如果2个用户拥有相同的密码,该怎么办?在MySQL主题上 - 存储过程,函数,视图,触发器等等很久以前都被支持。 –

+0

@ N.B。 :2个用户具有相同的密码,但用户名不相同。在我的查询中,我在第一种情况下检查了用户名和密码。 –