使用客户端空闲计时器有多安全?大型web应用程序开发人员是如何做到的?


How secure is it to use client side idle timer / how do big web app developers do it?

我正在构建一个基于PHP的web应用程序,并实现了一个基于会话变量的登录方法。在加载任何内容之前,此方法清除所有在站点上花费X时间而没有加载新页面或重新加载同一页面的用户的"登录"状态。现在这工作得很好,但是这只在页面加载时进行检查,而不查找鼠标/键盘活动(想想正在填写的长表单)。

这里也有人问过类似的问题,但是代码的安全漏洞从未被质疑过。我还找到了Paul Irish的解决方案,但是也没有找到任何关于安全性的参考。

这是一个现实的恐惧,在所有的javascript代码可能被停用/拦截,以防我保持一个"绝对超时"的服务器端?其他大型网页应用设计师是怎么做的?

这里有许多相互关联的问题。我的方法是,这可以完全首先在服务器端完成,然后在上面添加JavaScript改进,这样即使客户端东西无法运行也没关系。

解决方案的核心是在用户登录时在服务器上设置一个last_seen时间。每当检测到任何用户活动(无论是页面呈现还是AJAX响应)时,请检查此时间是否在您可接受的范围内,以及是否用当前时间覆盖它。如果超出当前边界,则在服务器端销毁会话,并使用合适的消息强制重定向到登录页面。

一旦您这样做了,就没有办法修改服务器端值,除非用户为了避免超时而人为地刷新他们的页面——但是在这种情况下,您将无法确定"真正的"页面请求和只是为了重置会话计时器而设计的页面请求之间的区别。如果您担心用户计算机上的恶意软件,或者对用户连接的高级中间人攻击,那么无论如何,您都有比会话超时更大的问题。

设置好后,您可能希望使用JavaScript在每个页面上运行一个计时器,自动显示注销消息。只需将这个计时器设置为与超时相同的时间长度,当然,如果在页面上触发AJAX操作,则重新启动它。您可以将此消息注入DOM,而不是重定向,因此,如果用户正在填写表单,他们不会丢失他们的工作。

正如您所说,您总是可以检测表单按键来重置计时器。为此,向服务器发送一个AJAX操作,该操作将返回一个空的应答——这将自动发送cookie——只要确保您的标准会话代码也在这里运行。一定要使用JavaScript计时器,这样你就不会为每次按键发送AJAX op -如果它有时比按键晚10秒,那么你就不会压倒连接,并且你将确保你的应用程序保持快速。