2013-07-02 99 views
5

我正在開發一個Web應用程序,向用戶發送電子郵件通知以完成課程/教程。我添加了通過該電子郵件中的鏈接自動登錄用戶的功能。這個功能已被添加到互聯網上的幾個服務中,最着名的是OkCupid。自動登錄最佳做法

下面是我已經成立了我的表:

+----+-------------+-------------------+-----------+--------------+----------------------+ 
| id | key (22) | secret (40)  | user_id | action  | expires    | 
+----+-------------+-------------------+-----------+--------------+----------------------+ 
| 1 | IbQlQW8Dn...| hdC4dXQJUPA0... | 1  | lesson/14 | 2013-06-21 16:28:55 | 
+----+-------------+-------------------+-----------+--------------+----------------------+ 

當用戶通過電子郵件訪問一個鏈接,像這樣: http://example.com/go/IbQlQW8Dn8PNXJFFwHQxwh/hdC4dXQJUPA0pU7I6eUiXawbnobYv0iThA [HTTP:/example.com/go/ key/secret ]

服務器首先檢查該URL未過期基於在表中的日期。如果未過期,用戶將自動使用user_id登錄,然後重定向到action列中的給定網址。我使用了兩個單獨的值(key & secret)作爲增加安全性的URL(防止出錯)。

,因爲現在的網站(視頻課程)的性質,安全性是不是一個巨大的問題,但我還是想知道什麼最佳實踐來考慮。

  • 我應該限制次數的鏈接可以用嗎?
  • 目前,我有鏈接失效從發送的郵件 60小時(3天)。這應該降低?
  • 明顯的兩大風險爲未經授權的訪問包括有人轉發電子郵件或某人獲得訪問用戶的電子郵件帳戶。還有什麼要考慮的?

感謝大家的洞察力,如果這應該被轉移到StackExchange的另一部分,請讓我知道。我知道我以前在這裏看過其他最佳實踐帖子。

回答

6

發送自動登錄鏈接是在風險發送電子郵件密碼重置鏈接非常相​​似和很多網站做到這一點。

這是一個主觀判斷,你必須做。人們使用共享決策矩陣來決定什麼是和不是可接受的風險。你在這裏做的更多的是一個商業決策,你權衡安全風險與易用性(這可以轉化爲更多的用戶和更多的業務)。

您需要提出問題'如果此功能被誤用,可能發生的網站可用性,商業信譽和用戶體驗方面最糟糕的是什麼?'

其他的事情你應該關心:

  1. 人們採摘您自動登錄鏈接關閉共享WiFi網絡的
  2. 在您的服務器和之間代理的日誌結束了自動登錄鏈接客戶端

我建議讓鏈接只使用一次或保持過期時間較短。您還應該進行監控,如果鏈路被過度使用,將會發出警報。

你也應該確保當你把這個祕密和查詢數據庫你不容易受到SQL注入。

2

我想你已經得到了所有的重要的東西。 @ u2702說我完全同意,只是添加...

  • 你可能想給用戶提供一種無效的傑出登錄鏈接,或者當他們改變他們的電子郵件地址或密碼自動失效他們。

  • 如果網站發送出大量的電子郵件,你可以跳過數據庫編碼用戶,目標,並在URL過期了簽名一起。亞馬遜支持這種臨時授權訪問對象S3(http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html)和其他網站使用它的CSRF令牌。僞代碼:

    ​​

    這只不過是生成的隨機密鑰好,像你一樣(你使用簽署請求沒有爲每電子郵件獨一無二的,因爲它不是露餡了),如果你不不介意負荷。

  • 我不認爲通過限制鏈接在過期之前可以使用的次數來獲得任何東西(OkCupid不會,有些人會保留最近的電子郵件並多次使用它)。

  • 是否單獨的「鍵」和「祕密」給你任何真正的額外的安全性,如果他們總是一起使用?

4

我幾乎一切u2702同意他的回答說,但你也應該考慮不能讓用戶不確認他們目前的密碼,如果他們目前的會議於任何形式的自動登錄的(cookie的創建更改他們的密碼,鏈接等)。這至少可以保護用戶免受更改密碼的鎖定。