我正在使用面向OAuth2.0 v20的PHP库
在draft20中,有一个提到利用国家预防CSRF
到目前为止,实现这个PHP库的我自己的web应用程序允许这样做:
对于上述三种情况,我都需要使用状态吗?
如果是的话,什么是“状态”的好例子?
什么是好的“状态”?
有理想长度吗?有最小长度吗?有最大长度吗?
有理想的妆容吗?字母数字包括大写字母?
发布于 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。
发布于 2014-05-13 19:58:10
通过CSRF攻击示例来了解状态参数是如何减轻这种攻击的,这可能会有所帮助。在本例中,Mallory是攻击者,Alice是受害者。
袭击
那么,如何使用state参数来防止这种情况呢?
预防
state参数state 参数一起发送回Alice的会话中的客户端state值,并将其与从授权请求发送回服务提供者的state值进行比较。该值与请求中的state参数不匹配,因为state值是根据Mallory的会话信息生成的,因此被拒绝。攻击者不应能够为任何特定用户生成状态值,因此,欺骗用户访问其授权URL没有任何效果。
发布于 2012-10-26 17:39:06
由于"state“只是一个随机字符串,所以这样做应该可以实现如下目的:
$state = md5(uniqid(rand(), TRUE));只需记住将其保存在您的会话中,以便您稍后可以检查它。
https://stackoverflow.com/questions/11071482
复制相似问题