谷歌浏览器崩溃后恢复会话cookie,如何避免?

Posted

技术标签:

【中文标题】谷歌浏览器崩溃后恢复会话cookie,如何避免?【英文标题】:Google Chrome restores session cookies after a crash, how to avoid? 【发布时间】:2014-07-25 16:06:44 【问题描述】:

在 Google Chrome 上(我在 Windows 8.1 上看到版本 35,到目前为止我没有尝试其他版本)当浏览器崩溃时(或者你只是拔掉电源线......)你'当您再次打开它时,系统会要求您恢复上一个会话。不错的功能,但它也会恢复会话 cookie

我不想在这里讨论它是否是一个错误 IMO 它是一个中度安全错误,因为可以物理访问该机器的用户可能会“引发”崩溃到 窃取未关闭的会话及其所有内容(不会要求您再次登录)。

最后我的问题是:网站如何避免这种情况?如果我使用 plain ASP.NET 身份验证和会话 cookie,我不希望它们在浏览器崩溃后仍然存在(即使计算机重新启动!)。

用户代理字符串中没有类似于进程 ID 的内容,并且 javascript 变量都已恢复(因此我无法存储随机种子,生成的 - 例如 - 服务器端)。还有什么可行的吗?会话超时会处理这个问题,但通常它会很长,并且我会消除一个 unsafe 窗口。

【问题讨论】:

使用beforeunload事件显式删除cookies是有效的。您可能希望使用 localStorage 来跟踪为您的站点打开了多少选项卡。 @ZachB tnx,我在一年前(左右)试图重现这个,它似乎已经解决了,但无论如何,我不能使用beforeunload,因为当浏览器崩溃(或者你只是从计算机上拔下电源线......)时不会调用它,它们是我写的两种情况。 【参考方案1】:

Adriano 的建议是个好主意,但实施存在缺陷。我们需要记住崩溃前的时间,以便我们可以将其与崩溃后的时间进行比较。最简单的方法是使用sessionStorage

const CRASH_DETECT_THRESHOLD_IN_MILLISECONDS = 10000;

const marker = parseInt(sessionStorage.getItem('crashDetectMarker') || new Date().valueOf());

const diff = new Date().valueOf() - marker;
console.log('diff', diff)

if (diff > CRASH_DETECT_THRESHOLD_IN_MILLISECONDS) 
    alert('log out');
 else 
    alert ('ok');


setInterval(() => 
    sessionStorage.setItem('crashDetectMarker', new Date().valueOf());
, 1000)

要进行测试,您可以通过在地址栏中输入chrome://crash 来模拟 Chrome 崩溃。

不要忘记在用户注销时清除crashDetectMarker

【讨论】:

关于日期的一个注释(我发布的代码也有同样的问题):它是本地时间,那么它会在转换到/从夏季时间时错误地计算间隔,只需要使用 UTC这里。它曾经工作只是因为 Chrome 恢复了(我想......)整个 JS 状态(或它的最后一个快照)。我从未调查过,现在看来 Chrome 可以按预期工作......【参考方案2】:

我没有找到任何可以用作 process id 的东西来确保 Chrome 没有重新启动,但是有一个 dirty 解决方法:如果我设置了一个计时器 (假设间隔为五秒)我可以检查从最后一个滴答声过去了多少时间。如果经过的时间太长,则会话已恢复并执行注销。大致是这样的(每个页面):

var lastTickTime = new Date();

setInterval(function () 
    var currentTickTime = new Date();

    // Difference is arbitrary and shouldn't be too small, here I suppose
    // a 5 seconds timer with a maximum delay of 10 seconds.
    if ((currentTickTime - lastTickTime) / 1000 > 10) 
        // Perform logout
    

    lastTickTime = currentTickTime;
, 5000);

当然这不是一个完美的解决方案(因为恶意攻击者可能会处理这个问题和/或禁用 JavaScript)但到目前为止总比没有好。

非常欢迎具有更好解决方案的新答案。

【讨论】:

以上是关于谷歌浏览器崩溃后恢复会话cookie,如何避免?的主要内容,如果未能解决你的问题,请参考以下文章

C# .NET winform 打开指定(谷歌)浏览器,如何设置cookie 实现自动登录

win7系统启用谷歌浏览器cookie的方法

在WIN7中,谷歌cookies文件位置

谷歌浏览器同步书签,重装系统后,重新安装谷歌浏览器怎么找回书签啊

谷歌浏览器怎么打开cookie

护照谷歌身份验证非持久性