如何通过Anti Forgery GET请求防止CSRF攻击

时间:2014-07-07 05:00:11

标签: c# security asp.net-mvc-5 antiforgerytoken csrf-protection

我的问题是ASP.NET MVC 5,关于XSS / CSRF攻击。

ASP.NET MVC通过生成Anti Forgery Token来提供防止CSRF攻击的规定。

但此令牌只能用于POST请求。

根据我的测试团队防止CSRF攻击,每个请求都应该有一个令牌号,并且他们要求只有POST请求而不是单个GET请求。

所以我的问题是:

  1. 我们是否只需要POST请求以防止CSRF攻击?

  2. 我们如何通过GET请求生成和发送Anti Forgery Token?

2 个答案:

答案 0 :(得分:2)

如果您有向用户显示信息的页面,则这些页面应为GET方法。

GET的例子: -

  • 查看购物篮。
  • 显示用户详细信息表单。
  • 展示产品。

但是,如果某个网页对数据库进行了更改或进行了永久性更改(例如提交卡详细信息),则这些内容应为POST

POST的例子: -

  • 保存/更改购物篮时调用的页面。
  • 保存用户详细信息时调用的页面。
  • 登录。
  • 退出(很容易错过 - 通常网站将其实现为GET)。

如果您的网站针对每个操作使用了正确的方法,那么您只需要为POST方法实施CSRF保护。但是,如果您不小心使用GET应该使用POST(例如注销),那么修复此问题就是沿着查询字符串传递CSRF令牌(例如www.example.com/UserAccount/Logout?token=12345 ) - 建议改为POST

在这种情况下,您必须编写自己的代码来验证令牌,因为ASP.NET MVC ValidateAntiForgeryToken仅适用于POST个请求。请参阅此处how to make ValidateAntiForgeryToken work with GET

答案 1 :(得分:1)

无法使用get,POST,并且一个重要原因是HTTP GET应该 idempotent 并且它不应该更改应用程序中的任何行为,它应该只是用于获取数据。

因此,如果您要更改GET中的行为,请将其设为POST,然后您可以使用Anti Forgery Token。