2011-05-12 44 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); }

}

相關問題