关于安全:“在这台电脑上记住我” – 它应该如何运作?

“Remember Me On This Computer” - How Should It Work?

查看Gmail的cookie,很容易看到"记住我"cookie中存储了什么。用户名/一次性访问令牌。它也可以在用户名是秘密的情况下以不同的方式实现。但不管怎样…事情的安全性不是很高:你偷了饼干就准备走了。

但是,我的问题是在功能方面:您什么时候擦除他们的访问令牌?如果用户登录时没有在另一台计算机上单击"记住我",那么它是否会使所有计算机上的访问令牌失效?我在问传统上这是如何实现的,以及应该如何实现。


文章Persistent Login Best Practice和Improved Persistent Login Best Practice是关于如何实现这类功能的重要参考。

另请参见这些stackoverflow问题

  • 为网站实现"记住我"的最佳方法是什么?
  • 网站认证的最终指南


我经常同时使用2或3台机器,并且在所有机器上都有"记住我"。如果其中一个断开了另一个,那将是非常烦人的,所以我不推荐它。

传统上,它会使用超时,cookie会在一段时间后(或者当用户注销时)过期。

这完全取决于您的安全模型。如果您正在编写一个内部公司应用程序,您只希望一个用户在一台计算机上,那么您可能希望有比Gmail更严格的限制。

此外,请记住拒绝服务的可能性-如果一台计算机上的操作可能会强制另一台计算机不可用,则可以使用此方法防止合法用户在某些情况下收回控制权。


从另一台计算机登录不应使与另一台计算机上的cookie关联的登录无效。但是,如果用户登录或"不是你"?登录这里"这应该清除用户正在使用的cookie。

顺便说一句,偷一个cookie是很难的,因为它坚持使用https,而不是为了编写脚本。

通过向cookie的输出添加";httponly",这将使cookie对javascript不可用,例如

1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Set-Cookie: ASP.NET_SessionId=ig2fac55; path=/; HttpOnly
X-AspNet-Version: 2.0.50727
Set-Cookie: user=t=bfabf0b1c1133a822; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Tue, 26 Aug 2008 10:51:08 GMT
Content-Length: 2838

你可以阅读更多关于这个的信息

  • 对于.NET
  • 火狐支持
  • 杰夫-编码很难,我们去购物吧


"记住我"cookie也应该识别机器。它应该与机器有关,因为有些地方你想被记住,有些地方你不想被记住(家与工作)。

到期日期通常设置为一个合理的期限(两周)或在用户明确从机器注销之后,


访问令牌应该是特定于IP的,这样它们就不容易跨计算机传输。

它们的实现方式还应该允许用户查看哪些机器上有活动的令牌。

一旦在另一台计算机上创建了一个新的令牌,则选择终止该令牌的站点-选择其用户将不在多台计算机上访问其服务-或者如果选择了,则选择其使用方式使其重新登录。

您使用的策略实际上取决于您所持有的数据和用户的需求。


我要做的是将每个会话链接到一个IP地址。如果会话令牌是从与您所拥有的IP不同的IP发送的,请拒绝它。