веб-серверы golang принимают файлы cookie, несмотря на то, что срок их действия истек - PullRequest
0 голосов
/ 05 января 2019

Итак, я писал бэкэнд, используя Go, и пока я тестировал функцию входа в систему / выхода из системы, я заметил, что если я пытаюсь получить доступ к странице с просроченным файлом cookie, мне разрешается это делать. Это происходит только в том случае, если я использую неисправный клиент, потому что если я использую свой браузер, он работает правильно, что, как я предполагаю, означает, что cookie удаляется из веб-браузера, но не из моего бэкэнда.

Я тестировал разные решения, но, похоже, ничего не работает, я заметил следующее: я принял к сведению указатель карты, которая отображает файлы cookie, и заметил, что, несмотря на настройку «authenticated» Значение false, когда неисправный клиент пытается получить доступ к странице, для карты установлено значение true.

это промежуточное ПО, которое обрабатывает страницы, на которых пользователь должен войти в систему, и это должно блокировать вход в систему неисправного клиента, потому что значение «authenticated» из обработчика сеанса должно быть ложным (но это правда, несмотря на то, что установлено ложно до)

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)
    }

}

это функция выхода из системы, которая должна удалять куки (но не удаляет их изнутри)

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 будет недействительным от моего веб-сервера, поэтому, когда неисправный клиент пытается повторно подключиться, аутентифицированный имеет значение false, и он не должен иметь возможность доступа к страницам loggedInOnly, вместо этого я могу, потому что для аутентифицированного значения установлено значение 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, а затем сразу после истины, несмотря на то, что ничего не происходит в промежутке

...