CSRF防御方法

发布于 2024-10-12 13:22:36 字数 556 浏览 5 评论 0原文

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

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

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

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

你看到什么缺陷了吗?

亲切的问候。

I'm trying to protect my .NET web site against CSRF attacks using a hidden key in every form and an special temp cookie, so when the user POST the form I can compare the temp cookie key and the hidden key in the form.

But I don't wanna use Session or other shared object to keep those temp keys, so I've come up with this way:

  1. Browser ask for a form (GET).
  2. App generates a key, [userId] +
    [currentDateTime], symmetrically
    encrypted with a key that my app
    knows.
  3. App put that key in a hidden field
    in the form, and sent a cookie with
    that key too. Browser POST the form.
  4. App ensures that:

    1. The cookie value and hidden form value are the same.
    2. Can obtain an [userId] from the decrypted value, and it's the current user id.
    3. Can obtain a [DateTime] from the decrypted value.
    4. [DateTime] obtained is not more than 15 min old.
  5. Otherwise, reject POST and show error.

Do you see any flaw?

Kind regards.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无人问我粥可暖 2024-10-19 13:22:36

您描述的策略通常有效,被称为“双重提交饼干”。 您应该了解一些事情

  1. 但是关于.net 有一个框架来自动处理 CSRF, 。您应该找出并使用推荐的解决方案,而不是自己构建一些东西。不幸的是,我不是 .net 人员,因此无法指出正确的框架。
  2. 如果您必须构建我们自己的 CSRF 保护,那么最好对会话 ID 使用加密随机数,而不是加密用户 ID + 时间戳。如果您不小心,有多种方法可以解密甚至修改密钥。请参阅填充 Oracle

The strategy you describe works in general, and is known as "Double Submitting Cookies". BUT there are a few things that you should know about

  1. .net would have a framework to automatically take care of CSRF. You should find that out and use the recommended solution instead of building something on your own. Unfortunately, I am not a .net guy, so can't point at the right framework.
  2. If you must build our own CSRF protection, you are better off using a cryptographic random number for the session id instead of encrypting userid + timestamp. There are ways to decrypt a key and even modify it if you are not careful. See Padding Oracle
迷你仙 2024-10-19 13:22:36

为什么不使用内置的 ViewState 用户密钥?使用用户的登录名填充该内容即可完成。然而,这不会过期。

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

Why don't you use the built in ViewState userkey? Populate that with the user's login name and you're done. This however doesn't do expiry.

If you don't have authenticated users or don't like that approach because you don't like viewstate then you could write an HTTP Module which inserts a hidden form field like the one I wrote and published on codeplex - you should be able to adjust that for expiry.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文