【问题标题】:CSRF defense approachCSRF 防御方法
【发布时间】:2011-01-17 14:02:54
【问题描述】:

我正在尝试使用每个表单中的隐藏密钥和特殊的临时 cookie 来保护我的 .NET 网站免受 CSRF 攻击,因此当用户发布表单时,我可以比较临时 cookie 密钥和隐藏密钥表格。

但我不想使用Session 或其他共享对象来保留这些临时密钥,所以我想出了这种方式:

  1. 浏览器请求表单 (GET)。
  2. App生成密钥,[userId] + [currentDateTime],对称 用我的应用程序的密钥加密 知道。
  3. 应用程序将该键放在隐藏字段中 在表格中,并发送了一个cookie 那把钥匙也是。浏览器 POST 表单。
  4. 应用程序确保:

    1. cookie 值和隐藏表单值相同。
    2. 可以从解密后的值中得到一个[userId],就是当前的用户id。
    3. 可以从解密后的值中获取[DateTime]。
    4. 获得的 [DateTime] 不超过 15 分钟。
  5. 否则,拒绝 POST 并显示错误。

你看出什么缺陷了吗?

亲切的问候。

【问题讨论】:

  • 为什么不直接使用“UserKey”?

标签: .net security csrf


【解决方案1】:

您描述的策略通常有效,称为“Double Submitting Cookies”。 但是有一些事情你应该知道

  1. .net 将有一个框架来自动处理 CSRF。您应该找出并使用推荐的解决方案,而不是自己构建一些东西。不幸的是,我不是 .net 人,所以无法指出正确的框架。
  2. 如果您必须构建我们自己的 CSRF 保护,您最好使用会话 ID 的加密随机数,而不是加密用户 ID + 时间戳。如果您不小心,有一些方法可以解密密钥,甚至可以修改它。见Padding Oracle

【讨论】:

  • 很棒的链接。使用哈希会更好吗?
【解决方案2】:

为什么不使用内置的ViewState userkey?用用户的登录名填充它,你就完成了。但是,这不会过期。

如果您没有经过身份验证的用户或不喜欢这种方法,因为您不喜欢视图状态,那么您可以编写一个 HTTP 模块,该模块插入一个隐藏的表单字段,就像我在 codeplex 上编写和发布的那样 -您应该能够调整到期时间。

【讨论】:

  • 我没有使用 ASP.NET WebForms,我需要一个过期机制。基本上,我使用自己的方式从 ASP.NET 运行时生成 HTML。您开发的组件非常酷,恭喜。
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 2015-10-02
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多