26

如何创建一个新的干净会话并使 Flask 中的当前会话无效?

我使用make_null_session()oropen_session()吗?

4

4 回答 4

30

我通过调用来做到这一点session.clear()

编辑:

在阅读了您在另一个答案中的评论后,我发现您正在尝试防止可能使用过去发布的 cookie 进行的重放攻击。我用这种方法尽可能地解决了这个问题*:

  • 覆盖 SecureCookieSessionInterface.save_session(),从覆盖的版本复制代码而不是调用它。
  • save_session()当调用的覆盖版本时save_cookie(),使其session_expires在未来 30 分钟后传递一个参数。这会导致超过 30 分钟的 cookie 被视为无效。
  • 定期更新会话变量的覆盖版本save_session(),以确保session_expires定期重写 cookie 及其时间。(我将此会话变量命名为 '_refresh' 并将当前时间存储在其中,然后仅在自上次存储时间以来经过几秒以上时才重写它。这种优化避免了在每个 HTTP 请求上重写 cookie。)

在自定义中复制 Flask 代码save_session()使这种方法有点丑陋和脆弱,但是为了更改传递给save_cookie(). 如果 Flask 让这件事变得更容易,或者至少实现自己的防范重放攻击的保护措施,那就太好了。

*警告:这种方法本身不会阻止在会话 cookie 的有效生命周期内可能发生的重放攻击。Liu, Kovacs, Huang, Gouda在RFC 6896和A Secure Cookie Protocol中讨论了基于 cookie 的会话的这个基本问题。

于 2012-12-06T00:42:04.483 回答
12

如果您有安全问题(每个人都应该有),答案是:

这是不可能的

Flask 使用基于 cookie 的会话。当您编辑或删除会话时,您向 CLIENT 发送请求以删除 cookie,普通客户端(浏览器)会这样做。但是如果会话被攻击者劫持,攻击者的会话仍然有效。

于 2014-01-13T04:29:45.810 回答
10

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

于 2012-12-06T03:45:48.663 回答
2

如果您使用默认的烧瓶会话并设置 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()
于 2012-12-06T17:22:40.563 回答