5

我正在开发一个网络应用程序,它会向用户发送电子邮件通知以完成课程/教程。我添加了通过该电子邮件中的链接自动登录用户的功能。此功能已添加到 Internet 上的多个服务中,其中最著名的是 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列中的给定 url。我为 url 使用了两个单独的值 ( key& secret) 只是为了增加安全性(防止 fusking)。

现在由于网站的性质(视频课程),安全性不是一个大问题,但我仍然想知道要考虑哪些最佳实践。

  • 我应该限制链接的使用次数吗?
  • 目前,我的链接在电子邮件发送后 60 小时(3 天)后过期。这个应该降低吗?
  • 未经授权访问的两个明显风险包括有人转发电子邮件或有人获得对用户电子邮件帐户的访问权限。还有什么要考虑的吗?

感谢大家的见解,如果这应该移动到 StackExchange 的另一个部分,请告诉我。我知道我过去在这里看到过其他最佳实践帖子。

4

3 回答 3

7

发送自动登录链接的风险与在电子邮件中发送密码重置链接的风险非常相似,许多网站都这样做。

这是你必须做出的判断。人们没有一个共享的决策矩阵来决定什么是可接受的风险,什么不是可接受的风险。您在这里所做的更多是一项业务决策,您正在权衡安全风险与易用性(这可以转化为更多用户和更多业务)。

您需要问一个问题:“如果该功能被滥用,在站点可用性、商业声誉和用户体验方面绝对最糟糕的事情是什么?” .

您应该关注的其他事项:

  1. 人们从共享 wifi 网络中提取您的自动登录链接
  2. 自动登录链接最终出现在服务器和客户端之间的代理日志中

我建议使链接仅供一次性使用或保持较短的过期时间。您还应该进行监控,如果链接被过度使用,则会发出警报。

您还应该确保在获取秘密并查询数据库时不会受到 SQL 注入的影响。

于 2013-07-03T16:15:50.923 回答
4

我非常同意 u2702 在他的回答中所说的一切,但是如果用户当前的会话是从任何形式的自动登录(cookie、链接等)创建的,您还应该考虑不允许用户在不确认当前密码的情况下更改密码。这至少可以保护用户不会因更改密码而被锁定在他们的帐户之外。

于 2013-07-16T00:52:52.273 回答
2

我想你已经掌握了所有重要的东西。我同意@u2702 所说的一切并添加......</p>

  • 您可能希望为用户提供一种方法来使他们未完成的登录链接失效,或者在他们更改电子邮件地址或密码时自动使它们失效。

  • 如果站点发送大量电子邮件,您可以跳过数据库并在 URL 中对用户、目标和到期时间以及签名进行编码。Amazon 支持此功能以临时授予对 S3 ( http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html ) 中对象的访问权限,其他站点将其用于 CSRF 令牌。伪代码:

    params = encode_qs(userid=1, target="lesson/14", expires=…)
    url = "http://example.com/l/?" + params + "&" +
          encode_qs(sig=hmac_sha1(secret, params))
    

    (您用于签署请求的秘密不必在每封电子邮件中都是唯一的,因为它没有被泄露。)如果您不介意负载,这并不比生成随机密钥更好,就像您所做的那样。

  • 我不认为通过限制链接过期前可以使用的次数来获得任何好处(OkCupid 不会,有些人会保留最近的电子邮件并多次使用它)。

  • 如果它们总是一起使用,单独的“密钥”和“秘密”是否会给您任何真正的额外安全性?

于 2013-07-15T20:54:43.377 回答