根据https://www.godoc.org/golang.org/x/oauth2#Config.AuthCodeURL
的文件...状态是保护用户免受CSRF攻击的标记。您必须始终提供非零字符串...
和http://tools.ietf.org/html/rfc6749#section-10.12
...发送到重定向URI端点的任何请求都包含一个绑定请求的值...
然而,当没有会话数据时,特别是流程中的部分,即用户尚未登录,并且仅在显示匿名页面时生成验证码。
如何将这个值随机化并在回调时进行比较?它是每个服务器随机化的静态值吗?
答案 0 :(得分:1)
状态
推荐。客户端用于维护的不透明值 请求和回调之间的状态。授权 服务器在重定向用户代理时包含此值 给客户。该参数应该用于防止 跨站点请求伪造,如第10.12节所述。
您使用state
来识别授权服务器的回调与发送的请求相匹配。如果没有state
攻击者可以使用您未请求的随机访问令牌调用您的回调URL。使用state
,您知道被叫回调是为了响应您的请求。
因此,您根据发送的请求随机化state
并跟踪它,直到您收到匹配的回调为止。只要无法猜到,它就可以是你想要的任何东西。
一种简单的方法是利用rand.Reader
和base64编码结果:
func state(n int) (string, error) {
data := make([]byte, n)
if _, err := io.ReadFull(rand.Reader, data); err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(data), nil
}