缓存包含CSRF保护表单的页面
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
缓存包含CSRF保护表单的页面
CSRF令牌对于每个用户都是不同的。这就是为什么在尝试缓存包含它们的表单的页面时需要谨慎的原因。
有关Symfony中CSRF保护如何工作的更多信息,请查看ob娱乐下载CSRF保护.
为什么使用CSRF令牌缓存页面是有问题的
通常,为每个用户分配一个唯一的CSRF令牌,该令牌存储在会话中以进行验证。这意味着如果你做缓存包含CSRF令牌的表单的页面,则将缓存的CSRF令牌第一个用户只。当用户提交表单时,令牌将与存储在会话中的令牌不匹配,并且所有用户(除第一个用户外)在提交表单时将无法通过CSRF验证。
事实上,许多反向代理(如Varnish)将拒绝缓存带有CSRF令牌的页面。这是因为发送cookie是为了保持PHP会话打开,Varnish的默认行为是不缓存使用cookie的HTTP请求。
如何缓存大部分页面,仍然能够使用CSRF保护
要缓存包含CSRF令牌的页面,可以使用更高级的缓存技术,如应急服务国际公司的片段,在这里可以缓存整个页面,并将表单嵌入到ESI标记中,而完全没有缓存。
另一种选择是通过非缓存AJAX请求加载表单,但缓存HTML响应的其余部分。
或者,您甚至可以用AJAX请求加载CSRF令牌,并用它替换表单字段值。看一看hinclude.js求一个很好的解。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。