代码之家  ›  专栏  ›  技术社区  ›  Chris B.

Chrome未将Cookie返回到服务器[重复]

  •  1
  • Chris B.  · 技术社区  · 6 年前

    我有一个带有会话的Flask应用程序,在本地开发机器上运行良好。然而,当我尝试在Amazon服务器上部署它时,会话似乎不起作用。

    更具体地说,没有设置会话cookie。不过,我可以设置普通的cookies。我确保我有一个静态安全密钥,因为其他人已经指出这可能是一个问题。唯一的区别在于服务器的设置方式。在开发过程中,我使用

    app.run()
    

    app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
    app.run(host='0.0.0.0', port=80)
    

    会议 似乎可以在Firefox上使用,但不能在Chrome上使用。

    下面的小应用程序演示了该问题,底部显示了配置差异:

    from flask import Flask, make_response, request, session
    
    app = Flask(__name__)
    app.secret_key = 'secretKey'
    
    # this is to verify that cookies can be set
    @app.route('/setcookie')
    def set_cookie():
        response = make_response('Cookie set')
        response.set_cookie('cookie name', 'cookie value')
        return response
    
    @app.route('/getcookie')
    def get_cookie():
        if 'cookie name' in request.cookies:
            return 'Cookie found. Its value is %s.' % request.cookies['cookie name']
        else:
           return 'Cookie not found'
    
    # this is to check if sessions work
    @app.route('/setsession')
    def set_session():
        session['session name'] = 'session value'
        return 'Session set'
    
    @app.route('/getsession')
    def get_session():
        if 'session name' in session:
            return 'Session value is %s.' % session['session name']
        else:
            return 'Session value not found'
    
    if __name__ == '__main__':
        app.debug = True
    
        # windows, local development
        #app.run()  
    
        # Ubuntu
        app.config['SERVER_NAME'] = '12.34.56.78'  # <-- insert a "real" IP
        app.run(host='0.0.0.0', port=80)
    
    0 回复  |  直到 9 年前
        1
  •  18
  •   davidism    8 年前

    RFC 2109 ,它描述了如何处理cookie,似乎表明cookie域必须是具有TLD(.com、.net等)的FQDN,或者是完全匹配的IP地址。这个 original Netscape cookie spec 根本没有提到IP地址。

    they corrected a bug 阻止了IP地址上的Cookie, they have apparently backpedaled IP地址。他们说他们 不会 解决这个问题,因为他们不认为这是一个错误。

    “正常”cookie工作但会话cookie不工作的原因是您没有为“正常”cookie设置域(这是一个可选参数),但Flask会自动将会话cookie的域设置为 SERVER_NAME . Chrome(和其他浏览器)接受没有域的cookie,并将它们自动设置到响应的域中,从而观察到行为上的差异。如果将域设置为IP地址,则可以观察到正常Cookie失败。

    在开发过程中,您可以通过在localhost上运行应用程序来解决这个问题,而不是让它默认为127.0.0.1。 Flask has a workaround 如果服务器名为localhost,则不会发送会话cookie的域。 app.run('localhost')

    在生产中,没有任何真正的解决方案。您可以在域而不是IP上提供此服务,这样可以解决此问题,但在您的环境中可能不可能。你可以强制所有的客户使用Chrome以外的东西,这是不实际的。或者您可以为Flask提供一个不同的会话接口,该接口对IPs执行与localhost相同的解决方法,尽管这在某种程度上可能是不安全的。

    Chrome不允许在域中使用带有IP的Cookie,也没有实际的解决方法。

        2
  •  2
  •   davidism    7 年前

    我的配置文件具有以下配置:

        SERVER_NAME = '192.168.0.6:5000'
        SESSION_COOKIE_DOMAIN = '192.168.0.6:5000'
    

    它允许我使用本地虚拟机,cookie在Chrome上运行得非常好,不需要本地FQDN。

        3
  •  1
  •   Andrew Magee    10 年前

    https://github.com/mitsuhiko/flask/blob/master/flask/sessions.py#L211-L215 ,您可以修补烧瓶代码并更改 if rv == '.localhost': rv = None rv = None 然后cookie域就不会被设置,你的cookie就可以工作了。

    您不希望在真正的生产应用程序上执行此操作,但如果您的服务器只是一种没有敏感数据的测试/暂存服务器,那么就可以了。我这样做只是为了测试一个应用程序在一个局域网上 192.168.x.x