我正在使用 Flask kvsession 来避免重放攻击,因为 Flask-login 使用的基于 cookie 的客户端会话很容易出现这种情况。例如:如果在 /index 页面上,您的标头中的 cookie 设置为您的应用标头,例如 myapp_session : 'value1' 并且如果您导航到 /important 页面,您将获得一个新标头,例如 myapp_session : 'value2' 所以如果黑客得到 ' value1' 他可以执行重放攻击并滥用它,因为它永远不会失效。
为了解决这个问题,我使用了flask-kvsession,它将会话cookie标头值存储在缓存或某个后端中。所以基本上只有一个 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 http://pythonhosted.org/Flask-KVSession/#flask_kvsession.KVSessionExtension.cleanup_sessions代码的 cleanup_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)
但这会删除所有键,因为我不知道当前会话的唯一键是什么。
Q2。另外,如何使用 memcache 而不是 redis,因为它没有 app.kvsession_store.keys() 函数并给出 i/o 错误。