【问题标题】:Deleting all cookies删除所有 cookie
【发布时间】:2020-12-27 10:04:11
【问题描述】:

我很难使用以下代码删除所有 cookie。似乎发生的事情是域被更改为在其前面附加一个点。我没有删除所有 cookie,而是得到域略有不同的重复 cookie。有什么方法可以完全删除所有 cookie,无论它们的域是什么样的?

感谢您的帮助!

//DeleteCookies deletes all cookies
func DeleteCookies(w http.ResponseWriter, r *http.Request) {
    for _, c := range r.Cookies() {
        deleted := &http.Cookie{
        Name: c.Name,
        Path: c.Path,
        //Expires:  time.Unix(0, 0),
        MaxAge:   -10,
        HttpOnly: c.HttpOnly,
        Domain:   c.Domain,
        Secure:   c.Secure,
        Value:    "",
        }
        http.SetCookie(w, deleted)
    }
}

【问题讨论】:

标签: go


【解决方案1】:

您尝试做的事情并不好,因为 cookie 不能那样工作。

简单的事情首先: HttpOnly、Domain 和 Secure:这些值在 HTTP 客户端请求中传输,c 的这些字段将始终为空。客户端使用这些字段来确定是否在Cookie 标头中发送(名称,值)对,但不发送这些值。

对于 HttpOnly、Secure(和 SameSite),这无关紧要,因为这些(以及 MaxAge 和 Expires)cookie 身份.

Cookie identity 基于在SetCookie 标头中发送的三元组(域、路径、名称)。通常域和路径是隐含的,但它们确实在客户端上定义了值。

现在要删除具有标识(Domain-X、Path-X、Name-X)的 cookie,您必须发送具有相同标识(Domain-X、Path-X、Name-X)且 MaxAge=-1 的 cookie .但如上所述,您收到的 cookie 不包含域和路径。

有两种方法:

  1. 您必须知道您的 cookie 是域 cookie 还是主机 cookie,以及它们设置的路径,并使用该信息删除它们。 (我会推荐这个。)

  2. 删除所有可能 cookie。根据对路径 /foo/bar/wuz 的请求,来自客户端的 cookie 可能来自路径 //foo/foo/bar(如果我没记错的话;在 RFC 6265 中进行测试和查找)。因此,删除所有这些路径的名称为“Name-X”的 cookie。对更复杂的 Domain 属性执行相同的操作。删除主机 cookie (Domain=="") 并删除域 cookie (Domain!="")。确保获得正确的域名(有效 TLD 加一)。

如您所见,2 相当复杂。但这就是 cookie 的设计方式:服务器应该知道服务器设置了哪些 cookie,即服务器应该知道其所有 cookie 的 cookie 身份(域、路径、名称)。客户端的职责是只为某个请求发回适当的 (Name,Value) 对。如果服务器希望删除一个 cookie,它只需将该 cookie 的 MaxAge 设置为 -1。请注意,“那个 cookie”是服务器应该知道的,而不是从客户端请求中推断出来的。

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2011-05-27
    • 2012-11-18
    相关资源
    最近更新 更多