Python 为什么会话cookie在从域提供服务时有效,而在使用IP时无效?
我有一个带有会话的Flask应用程序,在本地开发机器上运行良好。然而,当我尝试在Amazon服务器上部署它时,会话似乎不起作用 更具体地说,没有设置会话cookie。但是,我可以设置普通的cookies。我确保我有一个静态安全密钥,正如其他人指出的那样,这可能是一个问题。唯一的区别在于服务器的设置方式。在开发过程中,我使用Python 为什么会话cookie在从域提供服务时有效,而在使用IP时无效?,python,session,cookies,flask,Python,Session,Cookies,Flask,我有一个带有会话的Flask应用程序,在本地开发机器上运行良好。然而,当我尝试在Amazon服务器上部署它时,会话似乎不起作用 更具体地说,没有设置会话cookie。但是,我可以设置普通的cookies。我确保我有一个静态安全密钥,正如其他人指出的那样,这可能是一个问题。唯一的区别在于服务器的设置方式。在开发过程中,我使用 app.run() 在本地运行。部署时,我使用 app.config['SERVER_NAME'] = '12.34.56.78' # <-- insert a "
app.run()
在本地运行。部署时,我使用
app.config['SERVER_NAME'] = '12.34.56.78' # <-- insert a "real" IP
app.run(host='0.0.0.0', port=80)
app.config['SERVER_NAME']=“12.34.56.78”#这是Chrome中的一个“bug”,不是应用程序的问题。(如果其他浏览器更改其策略,也可能会影响它们。)
,它描述了如何处理cookie,似乎表明cookie域必须是具有TLD(.com、.net等)的FQDN,或者是完全匹配的IP地址。报告根本没有提到IP地址
Chrome开发者决定对cookie域接受的值比其他浏览器更严格。虽然在某一点上阻止了IP地址上的Cookie,但从那时起,不允许非FQDN域(包括本地主机)或IP地址上的Cookie。他们声明他们不会解决这个问题,因为他们不认为这是一个错误。
“正常”cookie正常工作但会话cookie无效的原因是您没有为“正常”cookie设置域(这是一个可选参数),但Flask会自动将会话cookie的域设置为服务器\u NAME
。Chrome(和其他浏览器)接受没有域的cookie,并将它们自动设置为响应域,因此观察到的行为差异。如果将域设置为IP地址,则可以看到正常Cookie失败
在开发过程中,您可以通过在localhost上运行应用程序来解决这个问题,而不是让它默认为127.0.0.1。如果服务器名为localhost,则不会发送会话cookie的域<代码>应用程序运行('localhost')
在生产中,没有任何真正的解决方案。您可以在域而不是IP上提供此服务,这将解决此问题,但在您的环境中可能不可能。你可以强制所有的客户使用Chrome以外的东西,这是不实际的。或者,您可以为Flask提供一个不同的会话接口,该接口对IP执行与localhost相同的解决方法,尽管这在某种程度上可能是不安全的
Chrome不允许在域中使用带有IP的Cookie,并且没有实际的解决方法。请注意,@davidism发布的本地主机解决方法--,您可以修补烧瓶代码,并将
如果rv='.localhost':rv=None
更改为简单的rv=None
,然后将不会设置cookie域,cookie将正常工作
您不希望在真正的生产应用程序上执行此操作,但如果您的服务器只是一种没有敏感数据的测试/暂存服务器,则可能没有问题。我这样做只是为了在局域网上测试一个应用程序,地址是
192.168.x.x
,这样就可以了。可以使用IP在Chrome浏览器中创建会话
我的配置文件具有以下配置:
SERVER_NAME = '192.168.0.6:5000'
SESSION_COOKIE_DOMAIN = '192.168.0.6:5000'
它允许我使用本地虚拟机,cookie在Chrome上运行得非常好,而不需要本地FQDN
SERVER_NAME = '192.168.0.6:5000'
SESSION_COOKIE_DOMAIN = '192.168.0.6:5000'