【问题标题】:Cache validation - Browsers validate cookies in cache incorrectly?缓存验证 - 浏览器错误地验证缓存中的 cookie?
【发布时间】:2012-05-16 15:38:31
【问题描述】:

我有以下情况:

  • 用户向显示表单的 PAGE A 发出请求(服务器存储此页面的缓存)
  • 用户将表​​单提交给用于表单提交的 CONTROLLER
  • CONTROLLER 在用户提交的数据中发现错误,设置 cookie ERRORS 详细说明,并将用户重定向回 PAGE A
  • PAGE A 显示原始内容加上 ERRORS(服务器存储此页面的缓存)
  • 页面 A 删除 ERRORS cookie

这可行,但前提是我不在系统上为 PAGE A 使用缓存。

问题是,在删除 cookie 后,浏览器在没有 cookie 的情况下向我的服务器发出请求并收到 304 Not Modified 错误,因此,浏览器仍然显示有错误的页面,而不是没有(来自原始请求)。服务器正确存储缓存(对于有错误的页面以及无错误的页面)。

基本上服务器现在有两个缓存页面:PAGE A 和 PAGE A WITH ERRORS。

浏览器,其最后一个已知页面是 PAGE A WITH ERRORS 向服务器请求具有 PAGE A 条件的页面,而不是 PAGE A WITH ERRORS,因为 cookie 不再存在。但它认为 304 响应是关于 PAGE A WITH ERRORS,而不是 PAGE A。我什至检查了浏览器发送的数据,它知道它使用 ERRORS cookie 获得了 PAGE A WITH ERRORS,但接受 304 not modified when在没有该 cookie 的情况下发出请求。它不会根据创建它的条件验证自己的缓存。

浏览器不使用它设置的 cookie 验证它的缓存吗?

在不为每个请求设置一些 GET 变量的情况下,是否有解决方法?另一种选择是告诉服务器永远不要缓存设置了这种错误状态的页面,但那将是一种黑客攻击。

【问题讨论】:

    标签: php validation caching browser cookies


    【解决方案1】:

    Cache-control: public 可能不是你想要的。 Public 本质上说您正在使用静态的、全局可访问的数据。它不会因用户而异。它在全局缓存,因为您声称数据是全局的。

    一旦您开始更改每个用户,缓存的假设就会被违反。 'private' 更类似于你想要的。

    但是,这意味着您获得的良好中间人缓存会减少。您可以通过重新验证或适当使用 Vary 标头来达到一些中间立场。

    【讨论】:

    • 这不起作用,Public 和 Private 之间的唯一区别是 Private 表示只有浏览器可以缓存,而使用 Public 则每个人都可以。我将其更改为 Private 并且行为是相同的(因为它是在发出请求时不要求缓存的浏览器)。为了确定,我在原始问题中将其更改为私有。
    【解决方案2】:

    显然解决方案是将其作为响应标头包含在内:

    Vary: Cookie
    

    这将在缓存引擎中考虑 cookie。

    编辑:

    但有一个问题:Chrome、Internet Explorer 和 Firefox 正常工作,但 Safari 和 Opera 在存储和验证缓存时都忽略了“Vary”标头。

    【讨论】:

      【解决方案3】:

      客户端会话(a.k.a cookie)可能不足以满足这种情况...... 会建议使用服务器端会话。即使 Vary 标头可能有效 - 使用 $_SESSION 您将处于保存状态。

      【讨论】:

      • 这是不正确的,服务器端会话仍然需要 cookie 才能工作,所以它有完全相同的问题。
      • 当然 - 让变量在服务器端可用更方便,而不仅仅是在客户端的 cookie 中。例如:许多 WordPress 博客被黑客入侵是因为人们从网吧(或其他公共计算机)登录 - 并且他们的客户端会话存储被劫持,所以这也是一个安全问题。根据问题,您的回答肯定是正确的 - 我只是想质疑这个场景。
      • 是的,cookie 仅用于识别,并在服务器端的页面之间传递错误消息(使用 $_SESSION)。
      • 最佳实践是分析具体需求,不要在客户端存储超出要求的内容。这不能一概而论,因为它取决于应用程序 - 以及它的可移植性。在我的 WP 示例中,它是这样实现的,以便在任何垃圾主机上运行,​​即使没有加载会话模块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2010-12-07
      • 2020-08-06
      • 2018-11-14
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      相关资源
      最近更新 更多