creativestyle / magesuite-vary-cookie-signer
X-Magento-Vary Cookie Signer
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