为什么werkzeug不允许使用localhost作为cookie域?
我在使用Flask的时候,想把localhost
当作cookie的域名,但werkzeug却给我报错:
ValueError: Setting 'domain' for a cookie on a server running localy (ex: localhost) is not supportted by complying browsers. You should have something like: '127.0.0.1 localhost dev.localhost' on your hosts file and then point your server to run on 'dev.localhost' and also set 'domain' for 'dev.localhost'
这真让人不爽,为什么每个开发者都得在hosts
文件里设置一个域名才能让项目正常运行呢?我不明白werkzeug为什么要这样限制!
我有几个问题:
- werkzeug为什么要这样做?
- 如果可以把
localhost
当作cookie域名,会发生什么? - 我怎么才能忽略这个错误?
2 个回答
正如 @Markus Unterwaditzer 提出的,你可以在本地伪造主机名,以便获取和设置与域名相关的 cookies。
为此,你需要输入 sudo vim /etc/hosts
:
127.0.0.1 localhost
127.0.0.1 fakesub.fakedomain.com
127.0.0.1 foo.bar.baz.anotherfakedomain.org
这样一来,你就可以使用和设置以下域名和子域名的 cookies:fakesub.fakedomain.com
、fakedomain.com
、foo.bar.baz.anotherfakedomain.org
、bar.baz.anotherfakedomain.org
、baz.anotherfakedomain.org
和 anotherfakedomain.org
。
我每天都使用这个方法,在本地为我的公司开发网站,利用公司生产网站提供的认证信息,通过 cookies 来实现。
问题并不是Werkzeug阻止设置基于域名的cookie,而是大多数浏览器不支持仅限于localhost(或其他单词域名)的域名cookie。为了避免让你自己去调试这个问题(为什么我的会话没有被识别),Werkzeug会检测到你使用这种设置,并立即报错。
我找到的最接近的原因是这个伪规范:
domain=DOMAIN_NAME
在查找有效cookie时,会将cookie的域属性与将要获取URL的主机的互联网域名进行比较。如果有尾部匹配,那么cookie会通过路径匹配来判断是否应该发送。"尾部匹配"意味着域属性与主机的完全合格域名的尾部进行匹配。比如,域属性为"acme.com"的cookie可以匹配主机名"anvil.acme.com"和"shipping.crate.acme.com"。
只有指定域内的主机才能为该域设置cookie,并且域名必须至少包含两个(2)或三个(3)点,以防止出现像".com"、".edu"和"va.us"这样的域名。 [强调是我的] 任何在下面列出的七个特殊顶级域名中的域名只需要两个点。其他域名则至少需要三个点。这七个特殊顶级域名是:"COM"、"EDU"、"NET"、"ORG"、"GOV"、"MIL"和"INT"。
如果允许单一名称的域名,黑客就可以为.com
设置一个cookie,然后让浏览器将这个cookie传输到用户访问的每一个.com
域名。
另见:http://daniel.haxx.se/blog/2011/04/28/the-cookie-rfc-6265/