2015年底,在一个项目上,遇到了一个问题,系统在chrome下单点登录一切正常,只有在ie下,单点登录后就自动跳出,尝试了很多中方法来解决该问题,终于发现该问题所在。
原因:ie下,不支持含有下划线的(子)域名,按下划线的域名会导致cookie丢失。
IE(Internet Explorer) 对于含有下划线的(子)域名,是如何处理其 cookie 的。
显然这是事后诸葛亮。事实上,曾经有一个Internet Explorer FAQ,描述了IE在呈现含有下划线的域名或子域名的网页时,它会做出怎样的反应。要不是这一次遇到,我甚至不知道它曾被提过。
我的问题
系统里的会话cookie在 Chrome 和 Firefox 里运行正常,但是在 IE 不正常。甚至在最新的 IE 版本、IE11 亦是如此。这貌似属于设计上的 bug,在 IE 寿终正寝之前将一直存在。
或许Project Spartan,又叫 Microsoft Edge将会改变这种陈旧的行为?
你说的是哪个bug?
如果你的web应用程序使用的域名或子域名含有下划线,IE 将拒绝存储 cookie,任何种类的 cookie,从会话 cookie 到持久化 cookie。你的 web 服务器将依赖 Set-Cookie header 头,而客户端将乐于无视之。
[if !supportLists]· [endif]正常的域名:rctest.crc.com.cn。
[if !supportLists]· [endif]不正常的域名:rc_test.crc.com.cn
如果你用到了session和会话 cookie,问题就来了。每次页面刷新,客户端的响应将含有一个空的 cookie:header 头,因此服务器将在每次请求都生成一个新的 Set-Cookie header 头。
如果你的(子)域名含有下划线,cookie就无法在 IE 正常运行。
什么原因?
这个行为在微软的kb316112有介绍,它是一个 Windows 补丁,用于解决 CVE MS01-005,可追溯到2001年。
这是从2001年就出现的 cookie 漏洞,直到今天我们仍然经受其影响。
最初的CVE修复了这个问题:
该补丁消除了影响IE的三个漏洞。第一个涉及到 IE 处理没有「.」的 IP 地址的方式。
如果一个网站指定使用不含「.」的 IP 格式(比如,http://031713501415,而非 http://207.46.131.13),该请求在特定方式下就是不正确的,那么 IE 将认为这个网站不是互联网网站。它将把该网站视作内部网(Intranet)网站【注1】、只能打开内部网网域内的网页,而不能打开正确域下的网页。
这要求网站只需要较少的安全限制就可运行。
那么,为什么到了今天,针对CVE的修复仍然在影响着我们呢?
做为kb316112的修复部分,微软提出了针对 DNS 下域名的更加严格的校验。这本质上意味着,所有的域名必须遵循 DNS RFC。它最初可追溯到 RFC606 (1973)和 RFC608 (1974)。
猜猜最初的DNS语法没有包含什么?猜对了:下划线。
微软指出,将阻止任何含有不合法的DNS字符的 cookie。
安全补丁MS01-055将阻止服务器使用不正确的命名语法设置 cookie。含有 cookie 的域名只能在域名和服务器名字中使用字母数字字符(「-」或「.」)。
如果服务器名字含有其它字符,比如下划线(「_」),那么 IE 将阻止其 cookie。
下面是我认为它们的错误之处。
主机名字的确不支持下划线,但是它们在域名里是合法的。不同之处在于「主机名字」和「域名」的解释。
发布于1997年的 RFC2181,明确地指出:
DNS本身对于用来表示资源记录的具体标签只做了一个限制,这个限制与标签和全名的长度有关……
DNS协议的实现不必把任何限制附加到可被使用的标签上。尤其是,DNS 服务器一定不能因为某个域含有可不被某些 DNS 客户端程序所接受的标签而拒绝它。
对我而言,微软貌似引入了一种错误的校验,且混淆了主机名字和域名。
���6
网友评论