Django附带 比如以你的保护中间, ,其产生的一个独特的每届会议的令牌供使用的形式。扫描所有进来的 POST 请求为正确的标记,并拒绝该请求如果令牌丢失或无效。

我想用的AJAX对于一些员额的请求,但所述的请求没有比如以你的牌availabnle.该网页有没有 <form> 元素挂钩到我宁愿不浑浊的标记插入令牌作为一个隐藏的价值。我想一个很好的方式来做到这一点是获得一个关于像 /get-csrf-token/ 返回的用户的标记,依靠浏览器的跨站脚本规则,以防止敌对网站的请求。

这是一个很好的主意吗?是否有更好的方式来保护对比如以你攻击同时仍然允许的AJAX?

有帮助吗?

解决方案

如果你知道你需要为AJAX请求提供CSRF令牌,你可以随时将它嵌入HTML中;然后你可以通过遍历DOM找到它。这样,您仍然可以访问令牌,但您不会通过API公开它。

换句话说:通过Django的模板 - 而不是通过URL调度程序。这种方式更加安全。

其他提示

更新:以下情况属实,如果所有浏览器和插件都已正确实施,则应为true。不幸的是,我们现在知道它们不是,并且浏览器插件和重定向的某些组合可以允许攻击者在跨域请求上提供任意标头。不幸的是,这意味着即使是使用<!>“X-Requested-With:XMLHttpRequest <!>”的AJAX请求;标题现在必须受CSRF保护。因此,Django 不再免除对CSRF保护的Ajax请求

原始答案

值得一提的是,保护来自CSRF的AJAX请求是不必要的,因为浏览器不允许跨站点AJAX请求。事实上,Django CSRF中间件现在自动免除AJAX请求的CSRF令牌扫描

仅当您实际检查<!>“XMLHttpRequest <!>”的X-Requested-With标头服务器端时才有效。值(Django所做的),并且只从CSRF扫描中免除真正的AJAX请求。

取消,我是错误的。(见的评论。) 你可以防止利用通过确保式如下规格:始终确保返回的一个目的文字作为顶级别对象。(我不能保证不会有进一步的攻击。想象一下浏览器提供的访问失败的代码在其窗口。onerror事件!)

你可以不依靠交叉点-脚本规则,以保持阿贾克斯的答复是私人的。例如,如果返回比如以你的标记作为式,一个网站可以恶意 重新确定串或阵列的构造 和请求的资源。

bigmattyh是正确的:你需要嵌入令牌的地方在标记。或者,可以拒绝任何职位 有一个程序, 不不 匹配。这样,只有人过分热心的软件防火墙将是脆弱的,比如以你的.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top