跨站请求伪造 (CSRF) 缓解

Posted

技术标签:

【中文标题】跨站请求伪造 (CSRF) 缓解【英文标题】:Cross site request forgery (CSRF) mitigation 【发布时间】:2013-07-17 00:23:38 【问题描述】:

我有一个关于 csrf 缓解的问题。文献建议在每个页面上使用一个令牌,该令牌必须与任何表格一起提交 - 此令牌必须对交易发生有效。

页面上的令牌如何防止 csrf? 我不能只发出一个 http GET 请求,从 html 解析令牌,然后在 POST 中使用该令牌(在某个时间限制内),因为 http 是无状态的?

【问题讨论】:

en.wikipedia.org/wiki/Cross-site_request_forgery 可能会让您更好地了解攻击是什么,以及为什么特定于页面的令牌可以缓解攻击。 【参考方案1】:

是的,你可以。但这不是 CSRF。 CSRF 是当我偷偷地让你执行你不打算执行的操作时。例如,如果你登录了一个特定的网站,我诱骗你点击了这样的链接:

http://test.com/action.php?delete_id=324

您单击该链接,但令人沮丧的是,您最终删除了一个您不想删除的资源。或者,如果我让您查看这样的图像怎么办(查看 src):

<img src="http://test.com/action.php?delete_id=324" />

但是,如果 action.php 需要一个令牌怎么办?然后我(攻击者)将不得不尝试找出您当前使用的令牌。

http://test.com/action.php?delete_id=324&token=89723gdeHDdhipd823igb9bd87309287bhdebvtaGY

否则,该操作将不会发生并且请求将被拒绝(或至少应该被拒绝)。

【讨论】:

谢谢 - 看来我正在将 XSS 与 CSRF 结合起来。【参考方案2】:

CSRF 保护并非旨在防止 DOM 解析或机器人获取令牌并提交表单。 CSRF 是指恶意网站向目标网站提交表单或请求,目的是更改某些设置或对已登录用户的帐户执行操作。

当表单提交时,目标站点的用户 cookie 会随请求一起发送,因此如果没有反 CSRF 令牌,恶意站点可能会影响用户的帐户或在目标站点上执行某些操作。恶意站点无法获取用户特定的反 CSRF 令牌,因此尝试会失败。

【讨论】:

以上是关于跨站请求伪造 (CSRF) 缓解的主要内容,如果未能解决你的问题,请参考以下文章

CSRF跨站请求伪造的安全防护

CSRF跨站请求伪造

Django--CSRF 跨站请求伪造

Web安全- 跨站请求伪造CSRF

跨站请求伪造CSRF原理

对CSRF(跨站请求伪造)的理解