CSRF防御方法

时间:2011-01-17 14:02:54

标签: .net security csrf

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

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

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

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

  6. 你看到任何缺陷吗?

    亲切的问候。

2 个答案:

答案 0 :(得分:2)

为什么不使用内置的ViewState userkey?使用用户的登录名填充它,您就完成了。然而,这不会到期。

如果您没有经过身份验证的用户或因为您不喜欢viewstate而不喜欢这种方法,那么您可以编写一个HTTP模块,其中插入一个隐藏的表单字段,就像我在{{3}上编写和发布的字段一样你应该能够调整到期日。

答案 1 :(得分:2)

您描述的策略通常起作用,称为“Double Submitting Cookies”。 但是您应该了解一些关于

的事情
  1. .net将拥有一个自动处理CSRF的框架。您应该找到并使用推荐的解决方案,而不是自己构建一些东西。不幸的是,我不是一个.net的人,所以不能指出正确的框架。
  2. 如果您必须构建我们自己的CSRF保护,最好使用加密随机数作为会话ID,而不是加密userid + timestamp。如果您不小心,有办法解密密钥甚至修改它。请参阅Padding Oracle