独特设备的最佳 php 登录系统逻辑是什么?

What is the best php login system logic for unique device?

我正在从事一个重要的项目,该项目对登录身份验证要求高级别的安全性。 公司经理告诉我,他想让客户仅在一台设备(PC,table 或移动设备 phone)中登录,这样即使他提供了,也只有该设备可以登录他的帐户电子邮件和密码给他人,它不应该让其他人登录到他的帐户,所以每个客户都有自己的帐户,只能从一个单一的设备访问。 我做了研究,但没有找到关于我的问题的太多答案,所以我到目前为止所做的是..

在数据库中注册后,我在名为 cookie 的用户 table 上添加了 2 列,用户首先看到的是 "Get access only to your device" 页面,他按下按钮并创建了一个 cookie他的设备同时也在数据库中,所以我可以从那里为用户建立一个独特的连接。我现在问有没有更安全的方法来为用户进行唯一登录,比如 PC 存储带有密钥的文件或其他无法通过清除历史数据删除的东西? 如果能给我这部分的建议会很有帮助...

这是一个棘手的问题。我将从您应该首先考虑的两个替代选项开始(2FA 和短会话),然后在我的回答中稍后进入硬件识别。

另一种选择是使用唯一设备作为双因素身份验证 (2FA) 的一部分。使用 phone 号码并在登录时向他们的 phone 发送包含一些随机数字的 SMS 消息(例如,Twilio 是执行此操作的不错服务,但如果发送许多 SMS 消息可能会变得相当昂贵).这允许某人从他们选择的任何设备登录,但他们必须拥有相关设备。要将登录限制为单个浮动设备,您可以将其设置为一次只允许单个帐户进行会话。这样,如果其他人设法登录(非常困难),其他设备就会被踢出。将帐户绑定到公司颁发的 phone 并使用 SMS 意味着该设备几乎可以肯定在登录时由该人拥有。

另一种选择是将您的登录系统与 YubiKey 或其他实现 U2FA 或 FIDO2 协议的硬件密钥集成。支持这些设备需要浏览器直接支持或通过扩展支持。钥匙也有点贵。

通过电子邮件发送 2FA 代码和使用 Google 身份验证器(应用程序)是另外两个不需要花钱的 2FA 选项。我在开源 CubicleSoft 单点登录 (SSO) 软件中实现了这两个:

https://github.com/cubiclesoft/sso-server

我还建议使用较短的会话超时(例如 5 分钟浮动 window)。只要浏览器选项卡处于打开状态,就向服务器发送定期心跳以保持会话处于活动状态(或者不需要并需要交互以保持会话处于活动状态 - 这取决于应用程序)。关闭所有选项卡后,会话终止,这需要用户再次登录。上面的 SSO 服务器产品还支持开箱即用的短会话管理。将 2FA 机制与短会话相结合可以减少多个用户在多个设备上登录到一个帐户的情况。

硬件出现故障,人们在新的、闪亮的东西出现时购买新硬件。当用户不得不切换设备时,将身份验证绑定到特定的硬件可能会导致真正令人头疼的问题。

但是,如果您真的想将登录绑定到单个设备,则应该查看 "web browser fingerprinting" 的大致方向。广告服务和分析行业一直在寻找方法来做您描述的事情,以便他们可以在不依赖浏览器 cookie 的情况下准确地跟踪一个人在网上旅行,这样即使 cookies/localStorage 被删除,跟踪信息也会持续存在。

本网站提到并演示了几种技术:

https://browserleaks.com/

另一种选择是使用附加的硬件设备 ID:

http://cubicspot.blogspot.com/2019/01/hardware-fingerprinting-with-web-browser.html

手机和平板电脑几乎都带有摄像头。笔记本电脑通常也是如此。台式电脑可能不会。

但是,如果您仅依赖于此或任何其他特定 API,那么将来可能会 change/break。

警告:在未经明确许可的情况下做任何唯一标识设备或用户的事情都可能违反 GDPR and/or 2018 年加州消费者隐私法。如果您的雇主在以下地区开展业务,则应咨询律师欧盟或加利福尼亚州,并将在这些地区的用户中使用您的登录系统。