2011-05-12 43 views
2

我在从头开始设计的站点中使用PHP和mySQL。当用户登录网站时 - 我应该选择用户名和密码还是用户名?

当该网站用户登录,我应该:

  • 使查询WHERE username='username' AND password='password',在这种情况下,我需要建立索引的用户名和密码字段,并且可以返回一个“坏登录”如果一个细节是不正确

  • 只作查询WHERE username='username',在这种情况下,我需要指标只是用户名字段,但需要检查服务器端密码是否匹配


UPDATE:
这个问题是关于很好的做法。它是关于在密码字段上添加索引的专业人员,以便我只有在两个细节都正确的情况下才能从数据库获得响应,超过了此索引所占空间和大小的缺点。
我不认为我的系统的具体(编程语言和数据库类型除外)是相关的,并且会有所帮助。

+0

哪种语言和数据库? – 2011-05-12 13:18:02

+0

语言:php,db:mysql – Doron 2011-05-12 13:20:49

回答

0

我会做后者(用户名是“你正在寻找的东西”,即使你在某个阶段做一个明确的密码验证),但是不可能为您提供量身定制的答案,而不需要深入了解您的特定代码库。

编辑

你提到的索引;索引只有当用户名和密码字段username是不唯一的..它应该是。所以这有点不切实际。

0

只要你的用户名='用户名'首先在你的sql语句中,那么我相信你不会在密码字段中获得性能损失。

我不知道这是肯定的,但我知道在编程语言中,如果第一条语句返回false,则不会评估AND链中的其他语句。

if(iAlwaysReturnFalse() && soIWontGetEvaluated()){ 
    System.out.println("I never get printed out :("); 
} 

但是,您可以轻松检查此假设。如果你有足够大的数据库。只是做一些测试。怎么看

SELECT * FROM user WHERE username = '...' and password = '...' 

执行对

SELECT * FROM user WHERE password = '....' and username = '...' 

和反对

SELECT * FROM user WHERE username = '...' 
+0

SQL不是一种编程语言。这比SQL查询的基本短路复杂一点。 – 2011-05-12 13:23:18

+0

@Tomalak有理由认为数据库将使用与编程语言相同的原理。 – netbrain 2011-05-12 13:26:07

+0

@netbrain:如果你明白它们有多根本不同,那么不是。 – 2011-05-12 13:26:48

-1

第一种方法是在第二个更好的,如果用户名匹配,那么你将不得不再次进行查询,以检查密码

0

你不提供许多细节,但总的来说,我去的第二个option.It将允许你做这样萎靡不振用户事情N次尝试使用不正确的密码登录后。

哦,当然,记得要保存在哈希形式的密码与正确随机盐,从未以明文形式。

0

我喜欢后者,原因如下:

  • 你可能想(不成功)登录尝试保存到数据库中,供您需要的用户记录,无论一个(在)的正确密码。

  • 你应该散列密码以及您可能希望实现只有一个地方你的散列算法(如PHP代码)。如果你的算法会改变,至少你不需要修改你的代码和你的SQL查询。例如:

    class用户{

    protected $ username; protected $ password_hash; 保护$盐;

    保护的函数hashPassword($密码){ 返回MD5($这 - >盐$密码。); }

    public function checkPassword($ password){ return($ this-> hashPassword($ password)== $ this-> password_hash); }

}

相关问题