首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSRF防御方法

CSRF防御方法
EN

Stack Overflow用户
提问于 2011-01-17 14:02:54
回答 2查看 515关注 0票数 1

我试图保护我的.NET网站免受CSRF攻击,在每个表单中使用一个隐藏密钥和一个特殊的temp,所以当用户发布表单时,我可以比较表单中的temp键和隐藏键。

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

  1. 浏览器请求一个表单(获取)。
  2. 应用程序生成一个密钥,userId + currentDateTime,用我的应用程序知道的密钥对称加密。
  3. App将该键放在表单中的一个隐藏字段中,并使用该键发送了一个cookie。浏览器发布表单。
  4. App确保:
代码语言:javascript
运行
复制
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.

  1. 否则,拒绝POST并显示错误。

你看到什么瑕疵了吗?

致以亲切的问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-17 14:33:30

您所描述的策略一般起作用,被称为"双重提交饼干“。但是有几件事你应该知道

  1. .net将有一个框架来自动处理CSRF。您应该找出这一点,并使用推荐的解决方案,而不是自己构建一些东西。不幸的是,我不是一个.net的家伙,所以不能指向正确的框架。
  2. 如果您必须构建我们自己的CSRF保护,那么最好为会话id使用一个加密的随机数,而不是加密userid +时间戳。有一些方法可以解密一个密钥,甚至修改它,如果你不小心。请参阅填充Oracle
票数 2
EN

Stack Overflow用户

发布于 2011-01-17 14:32:20

为什么不使用内置的ViewState用户密钥呢?用用户的登录名填充它,您就完成了。然而,这并没有过期。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4714016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档