AntiForgeryToken是如何工作的

时间:2011-01-31 15:43:48

标签: csrf antiforgerytoken

我正在努力保护CSRF并且有两个风尚:

  1. 从另一个站点进行POST,当我启用AntiForgeryToken
  2. 时失败
  3. 我已尝试从我的“恶意”Javascript(在另一个网站上运行)首先执行页面的GET,解析它并解压缩RequestVerificationToken然后执行POST。这也失败了,但我不明白为什么?
  4. 任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:68)

这是CSRF的一个很好的教程:

http://youtu.be/vrjgD0azkCw

以下是一般要点:您已登录银行的网站。您的银行会在您的计算机上放置一个cookie,以便它可以验证您的身份。每次您向yourbank.com发出请求(即加载页面)时,浏览器都会将cookie发送到Web服务器,Web服务器上的代码会检查cookie以确保您已经过身份验证。大。

但是,虽然Cookie还没有过期,但您检查邮件并打开一封来自尼日利亚王子的电子邮件,告诉您点击链接。你点击它(谁可以抗拒),而不是带你到王子所描述的页面,链接带你到这个URL:

http://yourbank.com/transfer.aspx?amt=1000000&from=myAccount&to=princeAccount

由于您已经在银行验证了身份(通过Cookie),因此它认为您实际上要求转移资金,所以它会这样做。

这显然是一个人为的例子,但它得到了重点。更现实的是,该链接可能会提交更改您所属论坛网站上的电子邮件地址的请求,以便他们可以访问它。

现在,回答您的具体问题:

解决此问题的一种方法(由Ruby和.NET及其他人使用)是包含一个防伪标记。基本上,当您请求页面时,服务器包含一个带有加密值的隐藏字段。当您提交表单时,网站会查看Cookie以确保您已经过身份验证,但它也会查看浏览器发送的加密值并确保其有效。加密令牌实际上是您的帐户所关联的会话ID。因此,服务器会看到cookie,将您标识为用户123,然后检查加密的表单字段标记,解密该值并确保未加密的值与您的会话或用户ID或其他内容匹配。如果是,它就知道继续。

向您发送链接的尼日利亚王子不知道您的会话ID是什么,即使他这样做了,他也无法使用与该网站相同的密钥和算法对其进行加密。使用。

你有它。一次阻止尼日利亚王子一个反伪造令牌。

(这里没有任何针对尼日利亚人或尼日利亚人的人。我确定他们是可爱的人。只是他们的王子有时表现得有点糟糕。):))

答案 1 :(得分:6)

出于安全原因,您无法使用AJAX从其他域检索内容。

因此,其他网站无法获取您的令牌。