在Flask中使旧会话无效

Tyi*_*ilo 22 python flask

如何创建新的清理会话并使Flask中的当前会话无效?

我使用make_null_session()open_session()

ʇsә*_*ɹoɈ 27

我是通过打电话来做的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的有效生命周期内可能发生的重放攻击.基于cookie的会话的这个基本问题在RFC 6896Liu,Kovacs,Huang,Gouda的安全Cookie协议中讨论.

  • Flask 的内置会话是基于 cookie 的,具有用于验证的哈希值和时间戳,因此不会像使用基于密钥的数据库存储支持的会话那样使它们无效。过去,您可以覆盖“SecureCookieSessionInterface.save_session()”以使用“session_expires”参数调用“save_cookie()”,但为什么还要麻烦呢?调用 `session.clear()` 会删除会话中的所有数据,将其留空。这还不够好吗? (2认同)

Tah*_*gir 10

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

这不是真的可能

Flask使用基于cookie的会话.当您编辑或删除会话时,您向客户端发送请求以删除cookie,普通客户端(浏览器)将执行此操作.但如果会话被攻击者劫持,则攻击者的会话仍然有效.

  • 不知道为什么这是低估的.这是一个正确的答案! (3认同)

Sea*_*ira 9

after_request如果设置了特定标志,您可以添加回调以删除会话cookie:

@app.after_request
def remove_if_invalid(response):
    if "__invalidate__" in session:
        response.delete_cookie(app.session_cookie_name)
    return response
Run Code Online (Sandbox Code Playgroud)

然后,只要您想使会话无效,您只需设置该会话密钥:

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

另见:http://werkzeug.pocoo.org/docs/wrappers/#werkzeug.wrappers.BaseResponse.delete_cookie