2012-06-04 53 views
7

我很抱歉,如果這可能是一些常識,但我還在學習。我有一個將文件同步到網絡服務器的iOS應用程序。一旦用戶登錄設備,他將保持登錄狀態,除非他退出。目前,只要用戶發起服務器請求(例如添加,更新或刪除文件),我只會將用戶的電子郵件而不是密碼發送到服務器,因爲用戶已在設備上進行身份驗證。我應該爲每個服務器請求驗證用戶的密碼嗎?

每次發出請求時,我是否應該發送用戶的存儲密碼,並在繼續處理請求之前讓服務器對其進行身份驗證?爲什麼或者爲什麼不?

回答

5

您應該發送會話標識符,而不是電子郵件地址。

會話標識符是一個很大的數字(128位是足夠的),當用戶被成功驗證時由密碼隨機數生成器選擇。它在用戶的Web設備中設置爲「cookie」,並通過安全通道(TLS)與每個請求一起發送。

電子郵件地址是公開的。您只能使用密碼來驗證請求,例如密碼或會話標識符。

+0

因此,每個用戶都有一個一次生成的會話標識符?這種類似於服務器請求的唯一ID嗎?它是隨每個請求而改變,還是它是一個生命期標識符?密碼散列怎麼樣?我可以用它來代替嗎? – Snowman

+0

您每次登錄時都會生成一個新的會話標識符。不確定您用於服務器的是什麼,但大多數會自動爲您執行此操作。關鍵在於,如果服務器在用戶登錄之前生成會話ID cookie *,並且通過不安全的渠道將該cookie發送出去,則必須使會話無效並在登錄時創建一個新的cookie。所有經過身份驗證的請求必須通過HTTPS執行。 – erickson

+0

因此,例如Facebook的iOS應用程序..用戶通常會保持登錄數月。他們會怎麼做?無論用戶登錄多少個月,他們都會使用相同的會話ID?他們是否發送電子郵件或密碼?他們如何查找用戶? – Snowman

4

我不是專家,但直到你在這裏得到更好的答案是一些提示:

  • 每個請求應包括某種形式的「會話標識符」,以表明它是登錄會話的一部分。這個標識符對於攻擊者猜測或重用應該是不可能的或困難的。通常HTTP cookies用於此目的,但您可以將它們包含在URL中。
  • 你不應該通過網絡發送明文密碼,因爲任何嗅探網絡的人都會看到它們。相反,您應該發送某種哈希密碼或使用質詢響應協議。

如果您使用的是HTTPS,那麼您可能無需擔心太多。如果它是未加密的流量,那麼您可能希望使用額外的散列值對每條消息進行「簽名」。

2

使用電子郵件地址標識用戶意味着某人可能會使用現有的用戶電子郵件地址僞造您的服務的訪問權限。正如Kristopher Johnson所建議的那樣,使用會話標識符可以避免公開證書,並且可能是一個很好的設計選擇。

OWASP的好人有一個session management cheat sheet這是一個很好的起點,任何設計。

如果有可用的話,他們建議使用現有的會話管理框架(Java EE,ASP.NET,PHP)。

-2

如果您要通過SSL,那麼每個請求都發送用戶名和密碼是最好的。爲什麼?因爲它更簡單的編程接口,因爲令牌不會增加真正的價值。在某些情況下,要獲取令牌,您必須發送證書,因此,如果您每次都發送證書,那麼它有什麼關係?沒有人可以在適合時間的情況下解密SSL。現在,Web服務器本身可能存在其他安全漏洞,但與從客戶端到服務器的傳輸無關(受保護)。因此,用戶/傳遞每個請求是最好的。

而且因爲它的iOS應用程序,你可以存儲在NSUserDefaults的憑證(這是沙箱到您的特定應用程序,並沒有其他的應用程序可以訪問它)

請了投票,並接受,其他的答案是誤導

現在,如果它不是一個iOS應用程序,並且您必須將憑據存儲在cookie中而不是NSUserDefaults中,那麼確定,也許您可​​以使用會話的參數。但除此之外,不值得頭疼!

+0

這不是一個簡單的服務器上的編程接口。大多數Web應用程序容器都假定使用會話標識符並自動爲您進行管理。任何體面的HTTP客戶端庫將提供類似的,因爲它是一個廣泛遵循的慣例。 – erickson

+1

@erickson其實它更簡單。想象一下。客戶端發送令牌。服務器發回令牌無效。客戶端必須請求新的令牌。那裏就是另一個不必要的步驟。 – MobileMon

+0

@erickson能否解釋在這種情況下使用令牌的真正好處?也許我可以學到一些東西 – MobileMon

相關問題