2011-12-10 50 views
2

這個程序有什麼問題嗎?這個密碼重置程序有什麼問題嗎?

  1. 以重置的形式輸入用戶名和電子郵件地址。
  2. Flask創建一個非常長的隨機字符串,並將其存儲到「reset_code」下的會話中。會議還將對「reset_pw_username」一鍵
  3. 瓶發送一封電子郵件,其中的鏈接路徑/ password_reset/reset_pw_username/reset_code
  4. 該鏈接會顯示一個表單,如果對話重置密碼相匹配的用戶可以重設密碼會話reset_code項目。否則它會炸彈。
  5. 會話將在一小時後過期重置代碼。

回答

2

您必須確保輸入的用戶名和電子郵件與其中一個帳戶匹配(或首先使用電子郵件作爲用戶名)。

從可用性的角度來看,如果顯示電子郵件中包含的鏈接的瀏覽器與最初使用的鏈接不同,這將不起作用。

除此之外,你應該特別注意reset_code的隨機性(而不是長度)。它應該是加密隨機的(即os.urandom),以便攻擊者不能簡單地猜測它。 random.random和派生方法不適合。

4

如果我可以輸入用戶名和電子郵件地址,那麼我可以爲通過電子郵件發送給我的服務的任何用戶獲得重置令牌。也許你應該檢查電子郵件地址是否屬於密碼將被重置的用戶。

1

正如Jean-Paul指出的那樣,要求用戶名和電子郵件都需要檢查它們是否都匹配相同的用戶。因此,請求用戶名或電子郵件,驗證它們在您的數據庫中,並將恢復鏈接發送到適當的地址更爲常見。如phihag所述,將會話恢復令牌存儲在會話數據中可能對某些用戶來說很麻煩。這些令牌通常存儲在常規數據庫中。但是,請注意,它們是與密碼相同的:一旦獲得,就可以自由交換密碼。因此,他們需要在存儲到數據庫之前對其進行散列(以與密碼本身相同的安全方式)進行散列。這也意味着您的恢復處理程序必須先對輸入的令牌進行哈希處理,然後再在數據庫中搜索它。

+0

好吧,如果你爲你的重置令牌生成一個長的隨機字符串,那麼沒有必要對它進行醃製。 –

0

最好的解決方法是使用電子郵件地址作爲用戶名,然後用戶只需要記住他的電子郵件地址。並且您只需驗證用戶的電子郵件地址即可。