使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单

Posted

技术标签:

【中文标题】使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单【英文标题】:Using AJAX GET to generate CSRF protected forms in a cached page 【发布时间】:2017-02-10 23:08:54 【问题描述】:

我的页面在数据库访问中使用了过多的时间并且模板处理速度很慢,因此我不得不使用使用 Redisdjango-cacheops 进行缓存。现在,由于我有使用 csrf 令牌的 POST 表单,因此这些值也将被缓存。我一直在考虑实施以下解决方案,但我仍然不确定它是否明智。

    为所有用户(无论是否登录)获取一个没有任何表单的统一缓存页面。 如果用户已登录,则使用 AJAX GET 请求启动嵌入在缓存页面中的小脚本以加载表单。

这种方法安全且明智吗?如果是这样,我如何使用 javascript/jQuery 和 cookie 知道我是登录用户(即如何区分客户端的用户和访问者,如服务器端的 request.user.is_authenticated())?

【问题讨论】:

【参考方案1】:

作为第一种方法,您可以尝试仅缓存最繁重的页面以呈现部分(确保繁重的数据库查询在此之前保持惰性)。您的表单应远离缓存部分。

第二种方法是两阶段缓存:基本思想是您不根据 cookie 和/或用户第一次渲染部分,缓存结果然后渲染之前排除的部分。这样一来,大部分页面和大部分负载都在缓存之后,您只会为每个请求渲染一小部分。

有一个django-phased 库,它实现了这种方法。不过,不确定它是否适合您,以及它与 cacheops 的配合效果如何。

【讨论】:

以上是关于使用 AJAX GET 在缓存页面中生成受 CSRF 保护的表单的主要内容,如果未能解决你的问题,请参考以下文章

在 .Net Core 控制台应用程序中生成受信任的自签名证书

ajax用get刷新页面元素在IE下无效解决~~

jQuery之异步Ajax请求使用

在 IE8 中意外缓存 AJAX 结果

http怎么做自动跳转https

触发单向 ajax 调用