php - 使用客户端空闲计时器的安全性如何/大型网络应用程序开发人员如何做到这一点?

标签 php javascript web-applications timeout idle-timer

我正在构建一个基于 PHP 的 Web 应用程序,并实现了基于 session 变量的登录方法。在加载任何内容之前,此方法会清除所有在网站上花费 X 时间的用户的“已登录”状态,而无需加载新页面或重新加载同一页面。现在效果很好,但是这只在页面加载时进行检查,并且不查找鼠标/键盘事件(想想正在填写的长表单)。

有人提出了类似的问题here然而,代码的安全漏洞从未受到质疑。我还找到了Paul Irish's solution to this但是也没有找到任何有关安全性的引用。

如果我在服务器端保留“绝对超时”,那么 JavaScript 代码可能会被停用/拦截,这是否是一种现实的恐惧?其他大型网络应用程序设计师是如何做到的?

最佳答案

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

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

完成此操作后,就无法修改服务器端值,除非用户毫无意义地人为刷新其页面以避免超时 - 但在这种情况下,您将无法确定“真实”页面请求与仅旨在重置 session 计时器的页面请求之间的区别。如果您担心用户计算机上的恶意软件,或者用户连接上的高级中间人攻击,那么无论如何,您都会遇到比 session 超时更大的问题。

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

正如您所说,您始终可以检测表单击键来重置计时器。为此,请向服务器发送一个 AJAX 操作,该服务器以空回复进行应答 - 这将自动发送 cookie - 只需确保您的标准 session 代码也在这里运行。请使用 JavaScript 计时器,这样您就不会在每次按下时都发送 AJAX 操作 - 如果有时比按键晚十秒,那么您就不会压垮连接,并且可以确保您的应用程序保持快速。

关于php - 使用客户端空闲计时器的安全性如何/大型网络应用程序开发人员如何做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17020302/

相关文章:

Java web 小程序/表单逆向工程

web-applications - 如何在 Web 应用程序中获取用户地区/国家信息?

web-applications - 程序员知识库基于网络的软件?

php - CodeIgniter 'MY_' 无法在...中找到错误

php - 如何匹配mysql中的逗号分隔值并获取值

javascript - 如何使计数变量在 session 中保持不变?

javascript - 如何以定义的顺序运行 Mocha 测试

javascript - 无法在 Jsfiddle 上运行 Highlight.js

php - 从 Javascript 计时器到数据库的耗时

javascript - Ajax Jquery更新Mysql表中的值并刷新页面上的值