谷歌浏览器崩溃后恢复会话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 实现自动登录