Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么会话cookie在从域提供服务时有效,而在使用IP时无效?_Python_Session_Cookies_Flask - Fatal编程技术网

Python 为什么会话cookie在从域提供服务时有效,而在使用IP时无效?

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 "

我有一个带有会话的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)
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'