例如,我有一个网站:www.example.com – 我希望我的客户只能通过一个浏览器的一个标签访问该网站.如果他们打开另一个选项卡并加载站点(或站点的子页面) – 我想要一个警报“无法打开多个实例”,然后将其重定向到错误页面.
一旦注意到 – 如果用户将地址从www.example.com/action/door/mine.aspx更改为www.example.com – 应该能正常工作,因为用户处于相同(原始)选项卡.
任何帮助将不胜感激.提前致谢.
解决方法
这是在this answer提到的确切的事情,你需要2个ID:
>一个随机的一个
>一个一致的(这将是我们的SSID,实际上,由于您限制单个浏览器的选项卡,最好从浏览器的唯一参数生成)
您可以从浏览器的用户代理生成一致的或从服务器端获取.两者都存储在服务器端.
将随机存储在window.name属性中,这是tab特定的.
每1〜2秒钟发送一次心跳信息,包含一致的ID和随机的ID.如果服务器无法接收到心跳,它将清除数据库并取消注册死客户端.
在每个浏览器的请求下,检查该值的window.name.如果缺少,请检查服务器端是否上一个选项卡是否关闭(从数据库清除).
如果是,请为客户端生成一个新的对,如果否,拒绝他.
在我脑海中的两个建议:
>服务器端(更好):提供所有客户端,用户名和密码.请求他们首先访问您的网站以输入他们的凭据.然后在每个其他请求中,检查是否已经登录了具有所述凭据的用户.
@H_301_29@ Client * | | Server ---> Check whether Already logged or not? ______________ | | yes no | | permit reject him him>客户端:如果您真的需要强烈的检查,请使用evercookie在客户端的机器上存储已登录的cookie.
旁注:知道客户端的每一次尝试都不安全!客户端应该帮助服务器端,不应该被用作唯一的安全来源. even evercookies can be deleted所以,给我的第一个建议去.
编辑:
Evercookie真的很好地保存了最安全的僵尸饼干,但由于图书馆本身对于浏览器来说有点沉重(存储cookie每次都需要100ms以上),所以真的不推荐在真实世界的网络应用程序中使用.
如果您使用服务器端解决方案,请使用它们:
> Way around ASP.NET session being shared across multiple tab windows
> Kiranvj’s answer