Php OAuth2.0服务器堆栈如何使用状态来防止CSRF?对于draft2.0 v20

Php OAuth2.0服务器堆栈如何使用状态来防止CSRF?对于draft2.0 v20,php,oauth,oauth-2.0,oauth-provider,Php,Oauth,Oauth 2.0,Oauth Provider,我正在使用 在draft20中,有一个 到目前为止,我自己实现此PHP库的web应用程序允许以下功能: 我是否需要在上述三种情况下都使用状态 如果是,什么是“国家”的好例子 什么是好的“状态” 有理想的长度吗?有最小长度吗?有最长的吗 有理想的化妆品吗?字母数字,包括大写?仅用于使用授权代码流的#1--3腿授权 当应用程序将授权代码交换为访问令牌时,您希望确保生成所提供授权代码的OAuth流实际上是由合法用户发起的。因此,在客户端应用程序通过将用户重定向到提供者来启动OAuth流之前,客户

我正在使用

在draft20中,有一个

到目前为止,我自己实现此PHP库的web应用程序允许以下功能:

  • 我是否需要在上述三种情况下都使用状态

    如果是,什么是“国家”的好例子

    什么是好的“状态”

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

    有理想的化妆品吗?字母数字,包括大写?

    仅用于使用授权代码流的#1--3腿授权

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

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

    该状态的存在是为了防止我通过电子邮件向您发送包含我的帐户授权代码的链接、您单击该链接以及应用程序在您不知情的情况下将所有数据推送到我的帐户

    OAuth 2.0威胁模型文档中提供了一些附加信息:

    具体请参见CSRF保护部分:

    由于“状态”只是一个随机字符串,所以制作这样的东西应该可以做到:

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

    请记住将其保存在会话中,以便稍后进行检查。

    通过一个CSRF漏洞示例,了解状态参数如何缓解此类攻击可能会有所帮助。在本例中,Mallory是攻击者,Alice是受害者

    袭击
  • Mallory访问一些客户的网站,并开始授权该客户使用OAuth访问一些服务提供商

  • 客户机请求服务提供商允许其代表Mallory请求访问,这是被授予的

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

  • 相反,Mallory会捕获/阻止此请求并保存其URL

  • 现在,马洛里以某种方式让爱丽丝访问了那个网址。如果Alice使用自己的帐户登录到服务提供商,则她的凭据将用于颁发授权码

  • 授权码被交换为访问令牌

  • 现在,Mallory在客户机上的帐户被授权访问Alice在服务提供商上的帐户

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

    预防
  • 客户端应该创建一个基于原始用户帐户的值(例如,用户会话密钥的散列)。它是什么并不重要,只要它是唯一的,并且是使用一些关于原始用户的私有的、不可用的信息生成的

  • 该值在上述第三步的重定向中传递给服务提供者

  • 现在,当Mallory让Alice访问保存的URL(上面的第五步)时,该URL包括使用Mallory的会话信息生成的
    状态
    参数

  • 授权码在Alice的会话中与Mallory的
    状态
    参数

  • 客户端根据Alice的会话信息生成新的
    状态
    值,并将其与从授权请求发送回服务提供商的
    状态
    值进行比较。此值与请求上的
    state
    参数不匹配,因为该
    state
    值是根据Mallory的会话信息生成的,因此被拒绝


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

    您创建一个随机状态值,并通常将其存储在服务器端会话中。“你”是谁?客户端应用程序?OAuth授权服务器?状态值的理想长度应该是多少?有最小长度吗?或最大长度?客户端应用程序将创建并验证它。OAuth授权服务器只不过传递它而已。Re-length最大长度将由OAuth提供程序确定。我会使用10个字符的随机字符串。您只是试图生成一些长到无法使用的内容。让我们在调用我的应用程序的回调URL时(由于服务提供商的重定向),查看会话cookie(实际上是一个包含用户id的加密cookie)并知道授予哪个用户访问权。在这种情况下,为什么我需要状态参数?简洁地解释说,Good JOB:)似乎很好。也许你可以说mallory如何给alice url,alice如何给mallory授权代码(她的客户端实例应该请求访问令牌)。我不明白1)Mallory可以让Alice像任何人点击链接一样点击链接(例如,将链接放在电子邮件中或其他网站上误导性的文字后面);2) 交换发生在Mallory在客户端的帐户和服务提供商之间。我认为描述的攻击缺少详细信息。Mallory捕获的授权URL不是特定于她的帐户的。将此发送给Alice不是问题;