【问题标题】:How to prevent CSRF attack through Anti Forgery GET request如何通过 Anti Forgery GET 请求防止 CSRF 攻击
【发布时间】:2014-08-27 12:07:28
【问题描述】:

我的问题是关于 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?

【问题讨论】:

  • Antiforgerytoken in asp.net mvc 总是在你的 html 页面中产生一个隐藏字段如果你想在 ajax 获取请求的情况下使用那个防伪令牌然后你可以通过选择令牌在 jquery 的帮助下获取令牌值通过 id 或 class...

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


【解决方案1】:

如果您有向用户显示信息的页面,那么这些应该是GET 方法。

GETs 的示例:-

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

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

POSTs 的示例:-

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

如果您的站点对每个操作都使用了正确的方法,那么您应该只需要为 POST 方法实施 CSRF 保护。但是,如果您不小心在应该使用 POST 的地方使用了 GET(例如注销),那么解决此问题的方法是沿着查询字符串传递 CSRF 令牌(例如 www.example.com/UserAccount/Logout?token=12345) - 更改为 @推荐使用 987654331@。

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

【讨论】:

    【解决方案2】:

    它不能用get来完成,需要POST,一个很大的原因是HTTP GET应该是idempotent并且它不应该改变应用程序中的任何行为,它应该只用于获取数据。

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

    【讨论】:

    • +1 我添加了一个指向 RFC2616 (HTTP) 的链接,该链接解释了安全和幂等的方法。
    • @jgauffin:虽然 GET 应该是 safe 而不仅仅是 idempotent
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2011-02-01
    • 2014-06-02
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多