使用会话令牌或nonce进行跨站点请求伪造保护(CSRF)


Using a session token or nonce for Cross-site Request Forgery Protection (CSRF)?

我继承了一些最近被攻击的代码,攻击者发送了重复的远程表单提交。

我使用为每个用户(不是会话id)创建的会话认证令牌实现了一种预防。虽然我意识到这种特定的攻击不是CSRF,但我从这些帖子中改编了我的解决方案(尽管过时了)。

  • https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29
  • http://tyleregeto.com/a-guide-to-nonce
  • http://shiflett.org/articles/cross-site-request-forgeries

然而,它仍然感觉这里有一些漏洞。虽然我知道没有什么是100%安全的,但我有一些问题:

  • 难道潜在的攻击者不能简单地启动一个有效的会话,然后在每个请求中包含会话id(通过cookie)吗?
  • 似乎nonce会话令牌更好。生成和跟踪nonce的最佳方法是什么?
  • 我遇到了一些关于这些解决方案只是单一窗口的观点。有人能详细说明这一点吗?
  • 这些解决方案是否总是需要会话?或者这些令牌可以在没有会话的情况下创建吗?UPDATE,这个特定的页面只是一个单页表单(没有登录)。因此,仅仅为了生成令牌而启动会话似乎有些过分。
  • 是否有一个更简单的解决方案(不是CAPTCHA),我可以实现防止这种不使用会话的特定攻击。

最后,我正在寻找一个更好的理解,这样我就可以实现一个更健壮的解决方案。

据我所知,您需要做三件事:使您所有的更改数据操作仅适用于POST请求,禁止POST请求没有有效的引用(它必须来自同一域),并检查每个POST请求中的认证令牌(POST令牌值必须与cookie中的令牌相同)。

前两个将使它很难做任何有害的CSRF请求,因为它们通常是隐藏的图像在电子邮件中,在其他网站等,和有效的引用进行跨域POST请求应该是不可能的/在现代浏览器中很难做到。如果不窃取用户的cookie/嗅探他的流量,就完全不可能做任何有害的动作。

现在关于你的问题:

    这个问题真的让我很困惑:如果你正确地使用了认证令牌,那么攻击者必须知道用户的令牌从cookie发送它与请求一起,那么为什么开始一个有效的攻击者自己的会话可以做任何伤害?nonce会让你所有的链接都很难看——我从来没有见过有人再使用它们了。我认为你的网站可以使用它,因为你必须保存/搜索数据库中的所有公告-很多请求生成公告可能会增加你的数据库大小真的很快(搜索它们会很慢)。
  1. 如果你只允许每个user_id一个公告来防止(2)Dos攻击,那么如果用户打开一个页面,然后打开另一个页面,然后提交第一个页面-他的请求将被拒绝,因为新的公告已经生成,旧的已经无效。
  2. 你将如何识别一个唯一的用户没有会话ID是一个cookie, GET或POST变量?

UPD:因为我们不再谈论CSRF了:你可以实现许多模糊的防御,以防止蜘蛛机器人提交你的表单:

  1. 不应该被填充的隐藏表单字段(bot通常会填充他们看到的大多数有好名字的表单字段,即使它们对用户来说真的是隐藏的)
  2. Javascript鼠标跟踪器(你可以分析记录的鼠标运动来检测机器人)
  3. 文件请求日志分析(当页面加载时,javascript/css/images在大多数情况下也应该加载,但有些(非常罕见)用户将其关闭)
  4. Javascript表单的变化(当一个隐藏(或不)字段被添加到一个表单的Javascript是需要在服务器端:机器人通常不执行Javascript)
  5. 流量分析工具,如Snort,用于检测Bot模式(奇怪的用户代理,过快的表单提交等)
但是在一天结束的时候,一些现代机器人使用真实用户行为的完全模拟(使用真实的浏览器API调用)-所以如果有人真的想攻击你的站点,没有像这样的防御可以帮助你。即使今天的验证码也不是很可靠——除了复杂的图像识别算法之外,你现在可以在任何网站上以低至1美元的价格购买1000个人工解决的验证码(你可以在发展中国家找到这样的服务)。所以,真的,没有100%的防御机器人-每个情况都是不同的:有时你必须自己创建复杂的防御系统,有时只是稍微调整一下就会有所帮助。