Constant Flask会话ID

hsk*_*k81 8 python session sessionid session-cookies flask

我有一个Flask应用程序,使用Nginx + WSGI(FastCGI和Gevent)并使用标准的Flask会话.我使用session.permanent=True或任何其他额外选项,只需设置SECRET_KEY默认配置.

不会在会话中保存任何(键,值)对,并且只依赖该SID = session['_id']条目来标识返回的用户.我使用以下代码阅读SID:

@page.route ('/')
def main (page='home', template='index.html'):

    if not request.args.get ('silent', False):
        print >> sys.stderr, "Session ID: %r" % session['_id']
Run Code Online (Sandbox Code Playgroud)

我做了以下观察:

  1. 对于相同的IP地址,但不同的浏览器我得到的不同SIDs- 这是预期的;
  2. 对于不同的IP和相同的浏览器,我再次有不同的SIDs- 预期;
  3. 对于使用相同浏览器的相同IP地址,我SID也一样- 也是预期的;

现在,第(3)点很有意思,因为即使删除相应的cookie也SID保持不变!在某种程度上,即使这可能是可以理解的,但实际上我期望SID在不同的cookie之间进行更改.但我看到的唯一区别是

session.new is True
Run Code Online (Sandbox Code Playgroud)

对于第一个 cookie的删除后,立即请求.即使这是非常期待的; 但鉴于这些事实,我面临以下问题:

  1. 这是否意味着对于坐在同一 IP 后面的不同用户(使用相同的浏览器配置),我的后端会将它们误认为是同一个用户?

  2. 如果不是第(1)点,那么这些"粘性"会话的当前行为实际上非常令人愉快,因为这避免了我的用户可能因为删除了相应的cookie而丢失数据的情况.

    他们仍然可以通过使用相同的浏览器从同一网络重新访问该站点来节省时间.我喜欢这样,但只有第(1)点不是这样的情况下.

  3. 我假设第(1)点实际上会咬我,结论实际上是保存token在会话中并因此接受用户可以通过简单地删除他的cookie来打击自己的命运?

  4. 或者有没有办法告诉每个新鲜的饼干Flask给出不同SIDs的?

实际上,这个问题引起了我的问题,因为我使用了一个负载影响服务,它模拟了不同的用户(在同一个IP上),但我的后端一直将它们视为单个用户,因为相应SIDs的都是相同的.

该应用程序可在http://webed.blackhan.ch上进行测试(一旦发布,将移动https://notex.ch [基于浏览器的文本编辑器]).谢谢您的回答.

Ble*_*der 6

看起来您正在使用Flask-Login扩展.这是生成id令牌的代码:

def _create_identifier():
    base = unicode("%s|%s" % (request.remote_addr,
                              request.headers.get("User-Agent")), 'utf8', errors='replace')
    hsh = md5()
    hsh.update(base.encode("utf8"))
    return hsh.digest()
Run Code Online (Sandbox Code Playgroud)

它基本上就是这样md5(ip_address + user_agent).

Flask使用Werkzeug的安全cookie来存储此标识符.安全cookie(顾名思义)是安全的:

此模块实现了一个不可从客户端更改的cookie,因为它添加了服务器检查的校验和.如果您拥有的只是用户ID或标记登录用户的内容,则可以将其用作会话替换.