Flask で新しいクリーン セッションを作成し、現在のセッションを無効にするにはどうすればよいですか?
またはを使用しますmake_null_session()
かopen_session()
?
を呼び出してこれを行いますsession.clear()
。
編集:
別の回答でコメントを読んだ後、過去に発行された Cookie を使用して行われる可能性のあるリプレイ攻撃を防止しようとしていることがわかりました。私はこのアプローチでその問題を可能な限り解決しました*:
save_session()
calls が、 30 分後に引数save_cookie()
を渡すようにします。session_expires
これにより、30 分以上経過した Cookie が無効と見なされます。save_session()
セッション変数を頻繁に更新して、Cookie とそのsession_expires
時間が定期的に書き換えられるようにします。(私はこのセッション変数に「_refresh」という名前を付けて現在の時刻を保存し、最後に保存された時刻から数秒以上経過した場合にのみ書き換えます。この最適化により、HTTP 要求ごとに Cookie が書き換えられるのを回避できます。)カスタムで Flask コードを複製save_session()
すると、このアプローチは少し見苦しく脆弱になりますが、 に渡される引数を変更するために必要save_cookie()
です。Flask がこれをより簡単にするか、少なくともリプレイ攻撃に対する独自のセーフガードを実装するとよいでしょう。
*警告: このアプローチだけでは、セッション Cookie の有効期間中に発生する可能性のあるリプレイ攻撃を阻止できません。Cookie ベースのセッションに関するこの根本的な問題は、RFC 6896およびLiu、Kovacs、Huang、Gouda による A Secure Cookie Protocolで説明されています。
セキュリティ上の懸念がある場合 (誰もが懸念するはずです)、答えは次のとおりです。
これは本当に不可能です
Flask は Cookie ベースのセッションを使用します。セッションを編集または削除するときは、REQUEST を 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
デフォルトのフラスコセッションを使用して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()