Constant Flask会话ID

时间:2013-02-13 08:20:07

标签: python session flask session-cookies sessionid

我有一个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']

我做了以下观察:

  1. 对于相同的IP地址,但不同的浏览器我得到的不同SIDs - 这是预期的;
  2. 针对不同的IP&相同的浏览器我再次有不同的SIDs - 期待;
  3. 对于使用相同浏览器的相同IP地址,我得到相同的SID - 也是预期的;
  4. 现在,第(3)点很有意思,因为即使删除相应的Cookie,SID仍然常量!在某种程度上,即使这可能是可以理解的,但实际上我期望SID在不同的cookie之间进行更改。但我看到的唯一区别是

    session.new is True
    

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

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

    2. 如果第(1)点这种情况,这些“粘性”会话的当前行为实际上非常令人愉快,因为这可以避免我的用户可能只是松散数据的情况因为他们删除了相应的cookie。

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

    3. 我认为第(1)点实际上会咬我,结论实际上是在会话中保存token因此接受用户可以自我炒作的命运,只需删除他的饼干?

    4. 或者有没有办法告诉Flask为每个新鲜Cookie提供不同的SIDs

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

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

2 个答案:

答案 0 :(得分:5)

看起来您正在使用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()

它基本上只是md5(ip_address + user_agent)

Flask使用Werkzeug's secure cookies来存储此标识符。安全cookie(顾名思义)是安全的:

  

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

答案 1 :(得分:0)

session['_id']不是实际的会话标识符。它只是Flask-Login用来实现Session Protection的值。

标准 Flask会话没有SID - 因为它没有任何意义,因为会话的实际内容存储在cookie本身中。另请参阅this