Подтвердить что ты не робот

Недействительный старый сеанс в Flask

Как создать новый чистый сеанс и аннулировать текущий флажок?

Использую ли я make_null_session() или open_session()?

4b9b3361

Ответ 1

Я делаю это, вызывая session.clear().

EDIT:

После прочтения вашего комментария в другом ответе я вижу, что вы пытаетесь предотвратить повторную атаку, которая может быть сделана с использованием файла cookie, который был выпущен в прошлом. Я решил эту проблему как можно больше * с помощью этого подхода:

  • Переопределите SecureCookieSessionInterface.save_session(), скопировав код из переопределенной версии, а не вызывая его.
  • Когда переопределенная версия save_session() вызывает save_cookie(), заставьте ее передать аргумент session_expires 30 минут в будущем. Это приводит к тому, что файлы cookie старше 30 минут считаются недействительными.
  • Сделать переопределенную версию save_session() обновлять переменную сеанса так часто, чтобы убедиться, что cookie и его время session_expires регулярно переписываются. (Я называю эту переменную сеанса "_refresh" и сохраняю текущее время в ней, а затем переписываю ее, только если прошло более нескольких секунд с момента последнего сохранения. Эта оптимизация позволяет переписать cookie на каждый HTTP-запрос.)

Дублирующий код фляжки в пользовательском save_session() делает этот подход немного уродливым и хрупким, но он необходим для изменения аргументов, переданных в save_cookie(). Было бы неплохо, если бы Флакс сделал это проще или, по крайней мере, выполнил свою собственную защиту от атак с помощью повтора.

* ПРЕДУПРЕЖДЕНИЕ. Этот подход сам по себе не остановит повторные атаки, которые могут произойти во время срока действия cookie сеанса. Эта фундаментальная проблема с сессиями на основе файлов cookie обсуждается в RFC 6896 и Безопасный протокол cookie Лю, Ковач, Хуан, Гауда.

Ответ 2

Вы можете добавить обратный вызов after_request, чтобы удалить cookie сеанса, если установлен определенный флаг:

@app.after_request
def remove_if_invalid(response):
    if "__invalidate__" in session:
        response.delete_cookie(app.session_cookie_name)
    return response

Затем вы просто устанавливаете этот ключ сеанса всякий раз, когда хотите аннулировать сеанс:

@app.route("/logout")
def logout():
    session["__invalidate__"] = True
    return redirect(url_for("index"))

Смотрите также: http://werkzeug.pocoo.org/docs/wrappers/#werkzeug.wrappers.BaseResponse.delete_cookie

Ответ 3

Если у вас есть проблемы с безопасностью (и каждый должен иметь) Есть ответ:

Это НЕ ДЕЙСТВИТЕЛЬНО возможно

Флажок использует сеансы на основе файлов cookie. Когда вы редактируете или удаляете сеанс, вы отправляете REQUEST клиенту для удаления cookie, обычные клиенты (браузеры) будут делать. Но если сеанс захвачен злоумышленником, сеанс атакующего остается в силе.

Ответ 4

Если вы используете сеансы флэшей по умолчанию и устанавливаете app.permanent_session_lifetime, то сеанс не будет работать, если пользователь попытается воспроизвести тот же сеанс до тех пор, пока сессия истекла. Если вы посмотрите на исходный код для open_session, строка:

max_age = total_seconds(app.permanent_session_lifetime)
try:            
    data = s.loads(val, max_age=max_age)
    return self.session_class(data)
    except BadSignature:
        return self.session_class()