【问题标题】:implementation of ajax status checkajax状态检查的实现
【发布时间】:2011-02-25 02:39:19
【问题描述】:

我正在与 PHP 中的race condition 保护作斗争。

我的应用程序是用 symfony 1.4 编写的,PHP 会锁定会话数据,直到页面完成处理。我有一个长时间运行(约 10 秒)的登录脚本,我想显示一个进度条,向用户展示他们在等待时正在做什么。 (我想实际显示正在执行的操作,而不是使用标准的 [faux] 加载栏。)

每当脚本调用session_start() 时,PHP 都会锁定该用户的会话数据,直到该脚本完成。这可以防止我的状态检查 ajax 调用在更长的运行脚本完成之前返回任何内容。 (关于为什么我的 ajax 调用不是异步的问题是here。)

我已经设计了一种方法来做到这一点,但我想确保这种方法对于一般用途来说足够安全(即,这不是银行应用程序)。

我的想法是:

  1. 在验证用户名和密码时(在长登录脚本开始之前),在客户端计算机上设置一个带有唯一标识符的 cookie。
  2. 此唯一标识符与客户端 IP 地址一起写入服务器上的文件。
  3. 当长登录脚本运行时,它将使用登录过程的状态更新该文件。
  4. ajax 状态检查将在不使用session_start() 的特殊页面上ping 服务器。此页面将获取 cookie 值和客户端 IP,并检查服务器端文件是否有任何状态更新。

这个解决方案有什么明显的问题吗?

再次,从安全角度来看,即使有人破解了这个,他们得到的只是一个代表登录进度状态的数字。

【问题讨论】:

    标签: php ajax symfony-1.4 race-condition


    【解决方案1】:

    我认为您提出的方法本身没有任何问题。

    但是,如果您的机器安装了APC,您可以使用apc_storeapc_fetch 将您的状态存储在一种共享内存中,而不是写入磁盘。使用apc_store(SID, 'login not started') 之类的东西来初始化和更新内存中的请求状态,然后使用apc_fetch(SID) 在后续请求中检索它。

    还有其他共享内存系统,包括Apache,甚至数据库连接可能更简单。

    【讨论】:

      【解决方案2】:

      我有同样的问题,我认为诀窍是 session_write_close() 释放会话文件。

      请查看我的https://github.com/jlaso/MySession 存储库并检查这是否适用于您的特定问题。

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 1970-01-01
        • 2020-05-03
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 2016-03-17
        相关资源
        最近更新 更多