使弗拉斯克的一次旧会议无效



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

我使用make_null_session()还是open_session()

我通过调用session.clear()来实现这一点。

编辑:

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

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

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

*警告:此方法本身不会阻止在会话cookie的有效生存期内可能发生的重播攻击。Liu,Kovacs,Huang,Gouda在RFC 6896和安全cookie协议中讨论了基于cookie的会话的这个基本问题。

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

这是不可能的

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

如果设置了特定标志,则可以添加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

如果使用默认的flask会话并设置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()

最新更新