缓存包含CSRF保护表单的页面

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

缓存包含CSRF保护表单的页面

CSRF令牌对于每个用户都是不同的。这就是为什么在尝试缓存包含它们的表单的页面时需要谨慎的原因。

有关Symfony中CSRF保护如何工作的更多信息,请查看欧宝娱乐app下载地址CSRF保护

为什么使用CSRF令牌缓存页面是有问题的

通常,为每个用户分配一个唯一的CSRF令牌,该令牌存储在会话中以进行验证。这意味着如果你缓存包含CSRF令牌的表单的页面,则将缓存的CSRF令牌第一个用户只。当用户提交表单时,令牌将与存储在会话中的令牌不匹配,并且所有用户(除第一个用户外)在提交表单时将无法通过CSRF验证。

事实上,许多反向代理(如Varnish)将拒绝缓存带有CSRF令牌的页面。这是因为发送cookie是为了保持PHP会话打开,Varnish的默认行为是不缓存使用cookie的HTTP请求。

如何缓存大部分页面,仍然能够使用CSRF保护

要缓存包含CSRF令牌的页面,可以使用更高级的缓存技术,如应急服务国际公司的片段,在这里可以缓存整个页面,并将表单嵌入到ESI标记中,而完全没有缓存。

另一种选择是通过非缓存AJAX请求加载表单,但缓存HTML响应的其余部分。

或者,您甚至可以用AJAX请求加载CSRF令牌,并用它替换表单字段值。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。