我是Rails安全的新手,我不明白一件事。存在CSRF漏洞,Rails中有protect_from_forgery方法生成令牌并保护我的应用程序免受来自其他站点的错误查询。这很好,但是这些网站可以从我的网站解析这个令牌,并使用CSRF漏洞。我不明白如何完全保护我的应用程序。提前致谢。
P.S。 Rails 4
答案 0 :(得分:1)
我假设您实际上使用的是默认提供的CSRF保护。
但是这些网站可以从我的网站解析此令牌,并使用CSRF 漏洞。
不,他们不能。这正是这种保护的工作方式。 CSRF令牌在每个会话中都不同,并且试图伪造请求的攻击者无法知道哪个CSRF令牌现在对您有效。或者,更准确地说,什么令牌有效在您做出所需(由攻击者)请求时,因为令牌是随机生成的,因此应该不可预测。
然而,这个令牌可能会因为中间人(一个更加困难的)攻击而从受害者的连接中嗅到,这可能反过来通过强制SSL来抵消。
Rails指南有a section on CSRF countermeasures。
答案 1 :(得分:0)
每次请求protect_from_forgery
都会添加
<head>
<!- ... ->
<meta content="authenticity_token" name="csrf-param" />
<meta content="xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc=" name="csrf-token" />
</head>
以及每种形式
<input name="authenticity_token" type="hidden" value="xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc=" />
并且还会添加
cookies[:_csrf_token] = "xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc="
然后在每个请求上,它将验证cookies[:_csrf_token]
是否与查询字符串参数(?authenticity_token=XX
)或标题(X-CSRF-Token: XX
)相同,您可以看到它{{3 }}
比较完成here。
要深入了解其工作原理,请阅读整个文件,所有魔法都会在那里发生。
回到最初的问题,恶意网站可以从您的网页解析令牌,他们所拥有的只是一个随机令牌,与受攻击用户的Cookie中的相同令牌不匹配。