2012-12-08 52 views
2

我有一個使用Symfony2構建的Web應用程序,其中一些項目與其他用戶共享。當一個項目被共享時,用戶會收到該項目的鏈接。我希望收到鏈接的用戶在點擊電子郵件時自動獲得該網站的身份驗證。到目前爲止,我所做的是:從鏈接中驗證用戶只能從電子郵件中點擊

  1. 生成與共享鏈接一個獨特的標記,並將其添加到鏈接
  2. 當鏈接是通過與誰進行共享的用戶點擊,唯一令牌檢查並且相應的用戶被認證。

但是,這種方法存在缺陷。如果其他用戶在瀏覽器中複製並粘貼相同的鏈接,或者原始收件人將郵件轉發給其他用戶,另一用戶將被認證爲鏈接的原始收件人。應該怎樣才能克服這些缺陷?我真正想要的是:

  1. 鏈接應該只驗證用戶,當從電子郵件內點擊並且不應允許直接訪問。
  2. 只有在最初發送郵件的鏈接被點擊的情況下,才能對用戶進行認證。

我已經閱讀了幾個有點類似要求的問題,但不完全一樣。而且,對他們的迴應導致了這樣的結論:這是不可能的。是不是真的 ?

+1

'是從郵件內點擊鏈接還是以某種其他方式訪問鏈接?檢查的唯一方法是引用者,而且**當然**不可靠。如果用戶將鏈接轉發給其他人,這是*他自己的錯誤*。或者,如果安全性很重要,您可以在訪問鏈接時詢問密碼*,而不是直接對其進行身份驗證。 –

回答

4

不幸的是,在這種情況下你可以做的事情不多。

你可以檢查引用者,但正如用戶Cthulhu指出的那樣,這樣的檢查將是不可靠的,並且容易出錯。

您可以:

  1. 確保有問題的令牌是唯一的用戶帳戶。即沒有兩個用戶可以擁有相同的標記。
  2. 將他們的用戶ID添加到鏈接,以便您可以針對特定用戶帳戶驗證令牌(而不是針對數據庫中的所有令牌執行一攬子搜索)。
  3. 爲令牌添加到期日期,以便一個月後有人點擊該令牌時,它將不再有效。
  4. 在點擊鏈接並驗證其電子郵件地址/帳戶後立即禁用令牌。這確保令牌永遠不會被重新使用。
相關問題