8

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

不在会话中保存任何 (key,value) 对,并且仅依靠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- 也是预期的;

现在,第 (3) 点很有趣,因为即使删除了相应的 cookie,它SID仍然保持不变!在某种程度上,这可能是可以理解的,但实际上我希望SID在不同的 cookie 之间发生变化。但我看到的唯一区别是

session.new is True

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

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

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

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

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

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

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

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

4

2 回答 2

7

看起来您正在使用 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 的安全 cookie来存储这个标识符。安全 cookie(顾名思义)是安全的:

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

于 2013-02-13T08:35:16.167 回答
0

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

标准Flask 会话没有 SID——因为会话的实际内容存储在 cookie 本身中,所以它没有任何作用。也看到这个

于 2017-08-27T21:16:50.830 回答