creativestyle/magesuite-vary-cookie-signer

X-Magento-Vary Cookie Signer

安装: 14

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 5

分支: 0

开放问题: 0

类型:magento2-module

v2.0.1 2023-05-11 14:24 UTC

This package is auto-updated.

Last update: 2024-09-08 08:07:00 UTC


README

Magento 使用名为 X-Magento-Vary 的特殊cookie来区分某些页面的不同版本(例如,具有特殊折扣的客户的产品详情页面)。

当使用varnish服务器时,这是通过将 X-Magento-Vary cookie的内容添加到哈希键来处理的。

这可能会被滥用以绕过varnish页面缓存,并通过为每个请求生成随机值来在php服务器上产生高负载。

此扩展通过提供包含 X-Magento-Vary cookie内容的sha1哈希和签名密钥(应为随机值)的额外cookie X-Magento-Vary-Sign 来提供一种验证varnish服务器上有效cookie的方法。不知道密钥的情况下,攻击者无法生成正确签名的cookie,我们可以在varnish服务器上验证它,并忽略不正确的值,因此可以重用缓存页面。

Magento配置

编辑/app/etc/env.php文件以配置签名密钥。

...
     'vary_cookie_sign' => [
            'key' => 'REPLACE_THIS_WITH_SIGNING_KEY'
     ]
...

Varnish配置

您需要安装uplex vmod_blobdigest,也作为RPM在mageops仓库中提供。

确保在您的VCL开头有这些导入

import blobdigest;
import cookie;
import blob;

添加到 sub vcl_init

new sha1 =  blobdigest.digest(SHA1);

添加到 sub vcl_recv

if (req.http.cookie ~ "X-Magento-Vary=") {
    cookie.parse(req.http.cookie);
    if(! sha1.update( blob.decode( encoded=cookie.get("X-Magento-Vary") + "REPLACE_THIS_WITH_SIGNING_KEY" ) ) ) {
         return (synth(500, "Internal Server Error"));
    }

    if ( blob.encode( encoding=HEX, case=LOWER, blob=sha1.final() ) != cookie.get("X-Magento-Vary-Sign") ) {
         cookie.delete("X-Magento-Vary");
         set req.http.cookie = cookie.get_string();
    }
}

注意:第一个if语句只能在调用finish之后调用update时失败,但是这是不可能的,然而VCL不允许调用对象方法,因此此函数主要是作为此限制的解决方案。

不要忘记将REPLACE_THIS_WITH_SIGNING_KEY替换为您的唯一随机字符串,并确保在varnish和magento中使用相同的值。

https://creativestyle.atlassian.net/wiki/spaces/MGSDEV/pages/2359951361/VaryCookieSigner+optional