我在一个从头开始设计的网站上使用PHP和mySQL。
当用户登录该站点时,我应该:
WHERE username='username' AND password='password'
,在这种情况下,我需要索引用户名和密码字段,如果其中一个细节不正确,可以返回“错误登录”或
WHERE username='username'
,在这种情况下,我只需要索引用户名字段,但需要检查服务器端代码中的密码是否匹配
更新
这个问题是关于良好做法的。这是关于在密码字段中添加索引的优点是否只有在两个细节都正确的情况下我才能从DB获得响应,这超过了该索引将占用的空间和大小的缺点。
我不认为我的系统的具体情况(编程语言和数据库类型除外)是相关的,并且会有所帮助。
答案 0 :(得分:0)
只要您在sql语句中首先使用username ='username',那么我相信您不会在密码字段中获得性能损失。
我不确定这一点,但我知道在编程语言中,如果第一个语句返回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 = '...'
答案 1 :(得分:0)
我会做后者(用户名是“你要搜索的东西”,即使你在某个阶段进行了明确的密码验证),但是不可能为你提供量身定制的答案,深入了解您的特定代码库。
修改强>
你提到索引;索引两者用户名和密码字段只有在username
不唯一时才有意义..它应该是。所以这有点没有实际意义。
答案 2 :(得分:0)
你没有提供很多细节,但一般情况下,我会选择第二个选项。它会允许你在N尝试使用不正确的密码登录后标记用户。
哦,当然,请记住使用正确的随机盐以哈希形式存储您的密码,而不是以纯文本形式存储。
答案 3 :(得分:0)
我更喜欢后者,原因如下:
您可能希望将(不成功的)登录尝试保存到数据库,因为无论密码是否正确,您都需要用户记录。
您应该对密码进行哈希处理,并且可能只想在一个位置实现哈希算法(例如,您的PHP代码)。如果您的算法会发生变化,至少您不需要修改代码和SQL查询。例如:
class User {
protected $ username; protected $ password_hash; protected $ salt;
受保护的函数hashPassword($ password){ return md5($ this-> salt。$ password); }
public function checkPassword($ password){ return($ this-> hashPassword($ password)== $ this-> password_hash); }
}
答案 4 :(得分:-1)
第一种方法比第二种方法更好,如果用户名匹配,那么你将不得不再次进行查询以检查密码