2013-07-02 66 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的创建更改他们的密码,链接等)。这至少可以保护用户免受更改密码的锁定。