golang网络服务器接受cookie,尽管它们已经过期

时间:2019-01-05 16:25:49

标签: go cookies gorilla mux

因此,我正在使用Go编写后端,并且在测试登录/注销功能时,我注意到,如果尝试使用过期的cookie访问页面,则可以这样做。仅当我使用有故障的客户端时才会发生这种情况,因为如果使用我的浏览器,浏览器就可以正常工作,我想这意味着cookie是从网络浏览器中删除的,而不是从我的后端中删除的。

我测试了不同的解决方案,但似乎没有任何效果,我注意到的是:我注意到了映射cookie的地图的指针,并且我注意到尽管设置了“ authenticated”错误的客户端尝试访问该页面时,将value设置为false。地图将其值设置为true。

这是处理用户应在其中登录页面的中间件,这应阻止有问题的客户端登录,因为来自会话处理程序的“已认证”值应为false(尽管设置了,但它是真实的之前为false)

func (s *server) loggedInOnly(handlerFunc http.HandlerFunc) http.HandlerFunc {

    return func(writer http.ResponseWriter, request *http.Request) {
        session, _ := s.store.Get(request, "session-handler")
        log.Printf("loggedInOnly: %p %v", &session.Values, session.Values)
        if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
            http.Error(writer, "Forbidden", http.StatusForbidden)
            return
        }
        handlerFunc(writer, request)
    }

}

这是注销功能,应该删除cookie(但不会在内部删除它)

func (s *server) handleLogout() http.HandlerFunc {

    return func(writer http.ResponseWriter, request *http.Request) {
        session, _ := s.store.Get(request, "session-handler")
        session.Values["authenticated"] = false
        session.Options.MaxAge = -1
        session.Save(request, writer)
        log.Printf("logout: %p, %v", &session.Values, session.Values)
        fmt.Fprint(writer, "Succesfully logged out")
        log.Printf("%v was logged out", writer)
    }

}

这是登录功能

func (s *server) handleLogin() http.HandlerFunc {

    return func(writer http.ResponseWriter, request *http.Request) {
        log.Printf("handle login called")
        session, _ := s.store.Get(request, "session-handler")

        // can login or not

        session.Values["authenticated"] = true
        session.Save(request, writer)

        Success(writer, "successfully logged in")
    }

}

我应该期望cookie从我的Web服务器上是无效的,以便当错误的客户端尝试重新连接身份验证时将其设置为false,并且他不应该能够访问loggingInOnly页面,但是我可以,因为身份验证值已设置为true(尽管之前被设置为false)。

这些是日志:

2019/01/05 17:00:00 loggedInOnly: 0xc0421960b0 map[authenticated:true]
2019/01/05 17:00:00 logout: 0xc0421960b0, map[authenticated:false]
2019/01/05 17:00:01 loggedInOnly: 0xc0420a4560 map[authenticated:true]
2019/01/05 17:00:01 logout: 0xc0420a4560, map[authenticated:false]

您可以看到,尽管之间没有任何反应,但是“ authenticated”已设置为false,然后立即为true。

0 个答案:

没有答案