首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OAuth2.0Server堆栈如何使用状态来防止CSRF?对于draft2.0 v20

OAuth2.0Server堆栈如何使用状态来防止CSRF?对于draft2.0 v20
EN

Stack Overflow用户
提问于 2012-06-17 13:04:34
回答 3查看 12.3K关注 0票数 13

我正在使用面向OAuth2.0 v20的PHP库

在draft20中,有一个提到利用国家预防CSRF

到目前为止,实现这个PHP库的我自己的web应用程序允许这样做:

  1. 使用授权代码请求的3条腿身份验证
  2. 使用资源所有者凭据授予的2条腿身份验证
  3. 刷新访问令牌的请求。

对于上述三种情况,我都需要使用状态吗?

如果是的话,什么是“状态”的好例子?

什么是好的“状态”?

有理想长度吗?有最小长度吗?有最大长度吗?

有理想的妆容吗?字母数字包括大写字母?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-18 04:38:06

只对#1 -使用授权代码流的3条腿授权。

当应用程序将授权代码交换为访问令牌时,您希望确保导致提供的授权代码的OAuth流实际上是由合法用户发起的。因此,在客户端应用程序通过将用户重定向到提供程序来启动OAuth流之前,客户端应用程序将创建一个随机状态值,并通常将其存储在服务器端会话中。然后,在用户完成OAuth流时,检查状态值是否与存储在用户服务器端会话中的值相匹配--这表明用户已经启动了OAuth流。

状态值通常应该是一个伪随机的不可猜测的值。可以用PHP中的rand()函数作为int生成一个简单的值,但是为了提供更大的保证,您也可以变得更加复杂。

这个状态的存在是为了防止像我这样的东西通过电子邮件给你发送一个链接,其中包含我帐户的授权代码,你点击它,然后应用程序将所有的数据推入你不知道的我的帐户。

一些附加信息在OAuth 2.0威胁模型文档中:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-threatmodel-00

特别是,请参阅关于CSRF保护的部分:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-26#section-10.12

票数 17
EN

Stack Overflow用户

发布于 2014-05-13 19:58:10

通过CSRF攻击示例来了解状态参数是如何减轻这种攻击的,这可能会有所帮助。在本例中,Mallory是攻击者,Alice是受害者。

袭击

  1. Mallory访问了一些客户端的网站,并开始了授权该客户端使用OAuth访问某些服务提供商的过程
  2. 客户端请求服务提供者以Mallory的名义请求访问权限,这是被授予的
  3. Mallory被重定向到服务提供商的网站,在那里她通常会输入用户名/密码以授权访问
  4. 相反,Mallory陷阱/阻止此请求并保存其URL
  5. 现在,Mallory以某种方式让Alice访问那个URL。如果Alice用自己的帐户登录到服务提供者,那么她的凭据将被用于发出授权代码。
  6. 将授权代码交换为访问令牌。
  7. 现在,Mallory在客户端的帐户被授权访问服务提供商的Alice帐户

那么,如何使用state参数来防止这种情况呢?

预防

  1. 客户端应该创建一个基于原始用户帐户的值(例如,用户会话密钥的散列)。不管它是什么,只要它是唯一的,并使用一些关于原始用户的不可猜测的私密信息生成。
  2. 此值在上面第三步的重定向中传递给服务提供者。
  3. 现在,当Mallory让Alice访问保存的URL (上面的步骤5)时,该URL包含了由Mallory的会话信息生成的state参数
  4. 授权代码被发出,并与Mallory的state 参数一起发送回Alice的会话中的客户端
  5. 客户端根据Alice的会话信息生成一个新的state值,并将其与从授权请求发送回服务提供者的state值进行比较。该值与请求中的state参数不匹配,因为state值是根据Mallory的会话信息生成的,因此被拒绝。

攻击者不应能够为任何特定用户生成状态值,因此,欺骗用户访问其授权URL没有任何效果。

票数 39
EN

Stack Overflow用户

发布于 2012-10-26 17:39:06

由于"state“只是一个随机字符串,所以这样做应该可以实现如下目的:

代码语言:javascript
复制
$state = md5(uniqid(rand(), TRUE));

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

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

https://stackoverflow.com/questions/11071482

复制
相关文章

相似问题

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