state
参数。显然,它是为了安全原因而存在的,但我不太明白它保护什么...例如,在GitHub上,此参数的描述如下:
据我所见,来自授权请求的状态只是作为参数传递到重定向URL,像这样:一个难以猜测的随机字符串。它用于防止跨站点请求伪造攻击。
http://<redirect_url>?code=17b1a8df59ddd92c5c3b&state=a4e0761e-8c21-4e20-819d-5a4daeab4ea9
有人能解释一下这个参数的确切目的吗?
state
参数。显然,它是为了安全原因而存在的,但我不太明白它保护什么...例如,在GitHub上,此参数的描述如下:
据我所见,来自授权请求的状态只是作为参数传递到重定向URL,像这样:一个难以猜测的随机字符串。它用于防止跨站点请求伪造攻击。
http://<redirect_url>?code=17b1a8df59ddd92c5c3b&state=a4e0761e-8c21-4e20-819d-5a4daeab4ea9
有人能解释一下这个参数的确切目的吗?
状态参数用于防止跨站请求伪造(XSRF)攻击。你的应用程序生成一个随机字符串,并使用状态参数将其发送到授权服务器。授权服务器将返回状态参数。如果两个状态参数相同,则为“OK”。如果状态参数不同,则表示有其他人发起了请求。
Google提供的示例可能更加清晰:https://developers.google.com/accounts/docs/OAuth2Login?hl=zh-CN#createxsrftoken
{"came_from": "/dashboard"}
。他们使用base64编码使其URL安全,并将其用于“state”参数。 - jeverlingstate在发送到redirect_uri的查询字符串中被回显。它有两个目的:
根据其名称,最初的用途是将状态信息从发起网页传输到redirect_uri。例如,我有一个流程,向用户发送一个链接,允许他们将其帐户链接到其他资源。该链接包含描述该资源的信息(令牌)。因此,用户点击链接后,他们会被带到一个网页,然后重定向到认证服务器。我需要该令牌通过认证过程返回到redirect_uri,以便redirect_uri背后的业务逻辑可以完成将资源链接到用户帐户。我通过使用"state"来携带这些信息。由于"state"没有大小限制,因此可以用来携带各种非常有用的信息。
作为防止XSRF攻击的手段...第三方很容易伪造请求发送到认证服务器,并欺骗您的redirect_uri接受响应。如果状态信息是随机生成的值,并且redirect_uri能够验证其为自己的值,那么您就可以保护自己免受此类攻击。
将两个目的完美地合并为一个是可行的。也就是说,您可以将您的redirect_url希望了解的已知值与随机数相加,然后将签名作为这两个值的SHA256哈希添加进去。例如:
sate = data + "." + random + "." + signature
其中,signature= BASE64_SHA256(data + "." + random + privateKey)
这样非常安全,因为所有状态信息都被完整地签名和保护,而如果您使用简单的安全令牌存储在会话中(如https://developers.google.com/identity/openid-connect/openid-connect?hl=en#createxsrftoken方法所示),则无法实现。
state
参数存在的目的是为了编码关于用户的信息,以便你知道要将收到的响应与哪个用户关联起来。state
参数,验证传递的信息是否对应于回调的已登录用户信息,然后继续获取授权令牌。