Php OAuth2.0服务器堆栈如何使用状态来防止CSRF?对于draft2.0 v20
我正在使用 在draft20中,有一个 到目前为止,我自己实现此PHP库的web应用程序允许以下功能: 我是否需要在上述三种情况下都使用状态 如果是,什么是“国家”的好例子 什么是好的“状态” 有理想的长度吗?有最小长度吗?有最长的吗 有理想的化妆品吗?字母数字,包括大写?仅用于使用授权代码流的#1--3腿授权 当应用程序将授权代码交换为访问令牌时,您希望确保生成所提供授权代码的OAuth流实际上是由合法用户发起的。因此,在客户端应用程序通过将用户重定向到提供者来启动OAuth流之前,客户端应用程序会创建一个随机状态值,并通常将其存储在服务器端会话中。然后,当用户完成OAuth流时,检查以确保状态值与存储在用户服务器端会话中的值匹配——这表明用户已经启动了OAuth流 状态值通常应该是伪随机的不可用值。在PHP中,可以使用rand()函数将一个简单的值生成为int,不过为了提供更大的保证,您也可以将其变得更复杂 该状态的存在是为了防止我通过电子邮件向您发送包含我的帐户授权代码的链接、您单击该链接以及应用程序在您不知情的情况下将所有数据推送到我的帐户 OAuth 2.0威胁模型文档中提供了一些附加信息: 具体请参见CSRF保护部分: 由于“状态”只是一个随机字符串,所以制作这样的东西应该可以做到: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流之前,客户
$state = md5(uniqid(rand(), TRUE));
请记住将其保存在会话中,以便稍后进行检查。通过一个CSRF漏洞示例,了解状态参数如何缓解此类攻击可能会有所帮助。在本例中,Mallory是攻击者,Alice是受害者 袭击
state
参数来防止这种情况呢
预防
状态
参数状态
参数状态
值,并将其与从授权请求发送回服务提供商的状态
值进行比较。此值与请求上的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不是问题;