【问题标题】:What does this vcl_hash function do?这个 vcl_hash 函数有什么作用?
【发布时间】:2014-06-13 08:28:11
【问题描述】:

在 wordpress 的几个 Varnish VCL 示例中,我看到以下内容:

sub vcl_hash {
  # Add the browser cookie only if a WordPress cookie found.
  if (req.http.Cookie ~ "wp-postpass_|wordpress_logged_in_|comment_author|PHPSESSID") {
    hash_data (req.http.Cookie);
  }
}

有人可以解释一下这是做什么的吗?我试过用谷歌搜索它,但我没有关注。

我想确保不可能有人只是创建一个包含一些垃圾的 cookie 并将其命名为 PHPSESSID 或其他名称,然后它会神奇地认为他们已登录?

【问题讨论】:

    标签: wordpress varnish varnish-vcl


    【解决方案1】:

    这会检查用户是否有一个名为其中之一的 cookie(每个 | 都是正则表达式 OR 运算符,因此它可以匹配其中任何一个)。如果存在具有该名称的 cookie,则我们对 cookie 的值进行哈希处理,以便用户获得自己的缓存。这是使用hash_data 函数实现的,该函数将参数添加到请求的缓存键中(因此您将req.http.Cookie 的内容添加到缓存键中)。

    这样做的原因是登录用户看不到来自已注销用户的页面缓存版本。

    这是非常安全的,虽然我个人不会这样做,因为它确实会引发一些问题(例如,用户注销并使其会话无效,但攻击者可以通过复制他们的个人资料页面来查看缓存页面请求标头)。

    更好的选择是不缓存这些页面(100% 安全)。你可以把它放在vcl_recv 函数中:

    sub vcl_recv {
      if (req.http.Cookie ~ "wp-postpass_|wordpress_logged_in_|comment_author|PHPSESSID") {
        return (pass);
      }
    }
    

    【讨论】:

    • 啊哈!我真的很想知道...我有你在我的vcl_recv 中输入的代码。所以你的意思是,只要我在 recv 中通过 100% 的时间,我就不需要 vcl_hash 中的任何代码?
    • 没错,如果你在vcl_recv 函数中有return (pass),那么vcl_hash 甚至不会被使用(它只在缓存中获取/存储项目时使用)
    猜你喜欢
    • 2017-05-27
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 2013-10-21
    相关资源
    最近更新 更多