OAuth2.0的服务器堆栈如何使用状态,以防止CSRF? 对于draft2.0 V20(OAu

2019-06-25 13:33发布

我使用PHP库对OAuth2.0的V20

在draft20,有一个使用状态,以防止CSRF的提

到目前为止,实现这个PHP库自己的Web应用程序允许如下:

  1. 使用授权码请求3条腿认证
  2. 使用资源所有者凭证格兰特2条腿认证
  3. 这刷新访问令牌的请求

我是否需要使用状态上述所有3种情况?

如果是这样,什么是“国家”的一个很好的例子?

是什么让一个很好的“状态”?

任何理想的长度? 任何最小长度? 任何最大长度?

任何理想的妆容? 字母数字,包括上壳体?

Answer 1:

只为#1 -使用授权码流3条腿的授权

当应用程序交换访问令牌的授权码,你要确保这导致提供的授权码的OAuth流实际上是由合法用户发起。 因此,客户端应用程序通过将用户重定向到提供商揭开序幕的OAuth流之前,客户端应用程序创建一个随机的状态值,通常将其存储在服务器端会话。 然后,当用户完成OAuth的流程,你检查,以确保状态值存储在用户的服务器端session--的值,指示用户已启动的OAuth流相匹配。

状态值通常应的伪随机不可猜测值。 一个简单的值可以与PHP中的rand()函数int类型生成,尽管你可以得到更多的复杂,以及提供更大的保障。

国家的存在是为了防止类似的事情我送你通过电子邮件包含了账户的授权代码的链接,你点击它和应用推动所有的数据到我的帐户,而您并不知道。

一些额外的信息是OAuth 2.0已威胁模型文档中: http://tools.ietf.org/html/draft-ietf-oauth-v2-threatmodel-00

特别是看到CSRF保护的部分: http://tools.ietf.org/html/draft-ietf-oauth-v2-26#section-10.12



Answer 2:

这可能是有益的步骤通过一个例子CSRF攻击,以了解一个状态参数如何减轻这类攻击。 在这个例子中马洛里攻击者爱丽丝受害者

攻击

  1. 马洛里拜访一些客户的网站,并开始授权客户端访问使用OAuth的一些服务提供商的过程

  2. 客户要求得到允许服务提供商请求访问的马洛里的代表,这是理所当然

  3. 马洛里被重定向到服务提供商的网站,在那里,她通常会以授权访问进入她的用户名/密码

  4. 相反,马洛里的陷阱/阻止此请求,并保存其URL

  5. 现在,马洛里莫名其妙地得到爱丽丝访问该网址。 如果爱丽丝被登录到她自己的帐户服务提供商,那么她的凭据将用于颁发授权码

  6. 授权码访问令牌交换

  7. 现在, 马洛里的客户端上的帐户被授权访问服务提供商Alice的账户

那么,我们该如何防止这种使用state参数?

预防

  1. 客户应建立以某种方式在原有基础上用户的账户(用户的会话密钥的哈希值,例如)的值。 不要紧,它是什么,只要它是独一无二的 ,使用关于原始用户一些私人,难以猜测的信息生成的。

  2. 该值被传递给服务提供商在重定向从上述步骤3

  3. 现在,当马洛里得到爱丽丝参观保存URL(第五步以上),该URL包括state与马洛里的会话信息生成的参数

  4. 授权码发出与马洛里的一起发送回客户端在Alice的会话state参数

  5. 客户端产生一个新的state基于Alice的会话信息价值,并将其与该state是从授权请求到服务提供商发回值。 此值不匹配state的请求参数,因为state根据马洛里的会话信息产生价值,所以它也被拒绝。

攻击者应该不能够产生任何特定用户的状态值,因此,用户欺骗到访问其授权的URL不起作用。



Answer 3:

由于“状态”只是一个随机字符串,使这样的事情应该做的伎俩:

$state = md5(uniqid(rand(), TRUE));

只要记住其保存在您的会话,以便您可以稍后检查。



文章来源: OAuth2.0 Server stack how to use state to prevent CSRF? for draft2.0 v20