gpt4 book ai didi

python - 如何从 Flask-KVSession 中删除特定 key (针对当前 session )?

转载 作者:行者123 更新时间:2023-11-30 23:07:54 27 4
gpt4 key购买 nike

我使用 Flask kvsession 来避免重播攻击,因为 Flask-login 使用的基于客户端 cookie 的 session 很容易受到重播攻击。例如:如果在/index 页面上, header 中的 cookie 是为您的应用程序 header 设置的,例如myapp_session:'值1'如果您导航到/重要页面,您将获得一个新标题,例如myapp_session :“value2”,因此如果黑客获得“value1”,他可以执行重放攻击并滥用它,因为它永远不会失效。

为了解决这个问题,我使用flask-kvsession,它将 session cookie header value 存储在缓存或某些后端中。所以基本上只有一个 myapp_session 会在您注销时生成并失效。但问题是:-

__init__.py 

from simplekv.memory.redisstore import RedisStore
import redis

store = RedisStore(redis.StrictRedis())
#store = memcache.Client(['127.0.0.1:11211'], debug =0)
store.ttl_support = True
app = create_app(__name__)
current_kvsession = KVSessionExtension(store, app)

如果你查看 kv-session 代码的 cleanup_session 部分 http://pythonhosted.org/Flask-KVSession/#flask_kvsession.KVSessionExtension.cleanup_sessions

它仅删除过期的 session 。但是,如果我想在注销时显式删除特定用户当前 myapp_session 的值,我该怎么做?

@app.before_request
def redirect_if_logout():
if request.path == url_for('logout'):
for key in app.kvsession_store.keys():
logger.debug(key)
m = current_kvsession.key_regex.match(key)
logger.debug('found %s', m)
app.kvsession_store.delete(key)

但这会删除所有 key ,因为我不知道当前 session 的唯一 key 是什么。

第二季度。另外,如何使用 memcache 而不是 redis,因为它没有 app.kvsession_store.keys() 函数并给出 i/o 错误。

最佳答案

我想我刚刚弄清楚了您问题的第一部分,即如何在注销时删除特定 key 。

正如文档中提到的:

Internally, Flask-KVSession stores session ids that are serialized as KEY_CREATED, where KEY is a random number (the sessions “true” id) and CREATED a UNIX-timestamp of when the session was created.

在客户端创建的示例 cookie 值(您可以使用 Firefox 的 cookie 管理器扩展进行检查):

c823af88aedaf496_571b3fd5.4kv9X8UvyQqtCtNV87jTxy3Zcqc

并将 session ID 作为 key 存储在 Redis 中:

c823af88aedaf496_571b3fd5

因此,在注销处理程序中,您只需读取 cookie 值,将其拆分并使用字符串的第一部分:

对我有用的示例代码:

import redis
from flask import Flask
from flask_kvsession import KVSessionExtension
from simplekv.memory.redisstore import RedisStore

store = RedisStore(redis.StrictRedis())

app = Flask(__name__)
KVSessionExtension(store, app)

#Logout Handler
@app.route('/logout', methods=['GET'])
def logout():
#here you are reading the cookie
cookie_val = request.cookies.get('session').split(".")[0]
store.delete(cookie_val)

既然您添加了 ttl_support:

store.ttl_support = True

如果您已在配置文件或 app.py 文件的开头设置了该值,它将与 permanent_session_lifetime 中的 TTL(秒)值匹配。

例如,在我的应用程序中,我在 app.py 文件的开头设置为:

session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=5)

现在,当我注销时,它会删除redis中的 key ,但直到TTL从300变为0(如permanent_session_lifetime值中提到的5分钟)才会被删除。

如果您想立即将其从 Redis 中删除,您可以手动将 app.permanent_session_lifetime 更改为 1 秒,这将依次更改 Redis 的 TTL。

import redis
import os
from flask import Flask
from flask_kvsession import KVSessionExtension
from simplekv.memory.redisstore import RedisStore

store = RedisStore(redis.StrictRedis())

app = Flask(__name__)
KVSessionExtension(store, app)

#Logout Handler
@app.route('/logout', methods=['GET'])
def logout():
cookie_val = request.cookies.get('session').split(".")[0]
app.permanent_session_lifetime = timedelta(seconds=1)
store.delete(cookie_val)

使用上面的代码,我能够阻止 session 重放攻击。

以及第二个问题的解决方案:

我发现的 3 个可能的错误是:

1:在您创建的代码的开头:

store = RedisStore(redis.StrictRedis())

但在循环中您将其用作 kvsession_store 而不仅仅是存储:

app.kvsession_store.keys()
  • 要在没有任何错误/异常的情况下使用它,您可以将其用作 store.keys() 而不是 app.store.keys():

    from flask_kvsession import KVSessionExtension
    from simplekv.memory.redisstore import RedisStore
    store = RedisStore(redis.StrictRedis())

    for key in store.keys():
    print key
  • store.delete(key) 并不是删除所有键,而是在循环内运行它,逐个删除所有键。

  • 关于python - 如何从 Flask-KVSession 中删除特定 key (针对当前 session )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32015470/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com