如何实施安全的“记住我”

Posted

技术标签:

【中文标题】如何实施安全的“记住我”【英文标题】:How to implement secure "Remember me" 【发布时间】:2018-07-25 08:45:20 【问题描述】:

我正试图弄清楚如何在我正在开发的应用程序中实现“记住我”。目前我的实现是这样的。

    用户登录并请求被记住 服务器使用电子邮件/密码验证用户 如果验证成功,我会使用用户的电子邮件和存储在服务器上的密钥生成 JSON Web 令牌。 然后令牌作为 cookie 发送回客户端。但同时使用 bcrypt 对令牌进行哈希处理,并将用户信息存储在数据库中。 现在,当用户稍后访问该页面时,该 cookie 会在页面加载并根据数据库中存储的哈希进行验证时发送到服务器。

对我来说,这“似乎”是安全的,因为令牌本质上是用户的密码,并在服务器端进行了相应的处理。但是,我不确定这是否真的安全,或者我是否缺少某些东西。

【问题讨论】:

我看到的一个问题是有人可以将 cookie 值复制到另一台计算机并以该用户身份登录。为了解决这个问题,你可以在加密算法中使用一些关于用户的秘密——也许是他们的密码? 【参考方案1】:

您可以使用 html5 Web Storage API 代替 cookie。它更安全,所有现代浏览器(IE8+)都支持。

LocalStorage 是一个很好的 Web Storage API 接口。它是一种客户端持久存储形式,没有任何过期时间(直到用户清除它)或开发人员通过 javascript 执行它。

您可以进一步研究这个答案difference between Cookie and LocalStorage。

【讨论】:

这两个选项都不安全。一个 HttpOnly cookie 将是这样做的一种方式。没有 JS 可以访问它(恶意软件和浏览器扩展),但是笔记本电脑的管理员和用户可以访问它。 @JuanCarrey HttpOnly Cookie 也是一个完全有效的解决方案,但它有几个问题,首先是 CORS,另一个是 CSRF。除非你设置了HttpProxy,否则你不能跨域,为了避免 CSRF,你需要制定一个anti-CSRF 策略。 @JuanCarrey 所以我提到的解决方案是可能的解决方案之一,尽管您仍然需要考虑XSS。但是网络存储非常安全OOB。对于HTTPOnly cookie,您还需要拥有支持它的后端。

以上是关于如何实施安全的“记住我”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 创建一个安全的“记住我”系统?

如何安全实现“记住我”功能

如何在 PHP 中安全地实现“记住我”按钮(持久登录)

AngularJS + Spring 安全记住我功能

如何分别为每一个定义“记住我”? Symfony 5

我的“记住我”php 登录系统有多安全? [关闭]