WEB安全第十八课 浏览器的安全模型扩展框架 |
历经将近十年的停滞状态之后,浏览器战争的烽烟再燃。完全延续了上世纪90年代第一次浏览器世界大战遗留下来的火种,各个浏览器厂商们又再度争相恐后地每月推出新功能。但这次的显著差别是,现在安全特色也成了突出的卖点。
当然,要客观衡量一个复杂软件的可靠性始终是计算机行业里的未解难题,尤其是如果这个产品的代码库里承载的是将近20年的骄傲自满,那问题显然更是加倍地严重了。因此浏览器之争几乎都表现为快速推出和部署安全相关的功能,但却很少去考虑到这些做法是否真的能解决问题。 🧒🧢📠😄👂 同时,创建标准的各个机构,普遍对早年的教训心有余悸,现在都倾向于放下原本学院派的教条态度,而选择由专业贡献者组成的团队按自己的意愿来调整规范。有传言说HTML5会是最后一个有编号的HTML标准,它已经逐渐变成一份每天都有修改,而且往往被改得相当激进,处于不断成长中的文档。 对新需求的这种放松态度显然有助于推动W3C和WHATWG组织的工作进程,但中心机构的缺位也会带来一定的问题。很多近期的提议实际上是在走捷径取巧,往往只针对一些小范围的修改,无法形成统一的整体性的框架。当出现问题时,由于缺乏可靠的反馈机制,使得外部的专家也无法在相对稳定的规范出台前参与审阅,并在具体开发之前提出可能会带来哪些问题。现在要想跟上标准的修订,就必须每天都要跟进工作组的快速变更。 现在还很难判断标准化工作的这种改变到底是好还是坏。实际上,这么做的好处可能轻而易举地盖过了潜在的风险;例如其中一个好处是,终于可能产生一份与浏览器实际情况尽量相近的规范。然而,这种狂热又基本不受监管的运作方式会带来怎样的后果,目前还难以预测,安全社区对这种状态必须保持十二万分的警惕。 ✍🪐🫖↔🦕 新的浏览器安全特性与未来展望 安全圈一直以来都梦想能推出全新的安全模型,但这样一来,势必导致需要重新构建整个Web体系。因此,更多的实际工作集中在对现有方案的修补扩展上,这样势必会增加浏览器里安全相关部分代码的复杂度。谁都不希望增加代码复杂度,但仍然有支持者坚定地认为这么做是有道理的,有时候他们是为某个当下还很难彻底解决的问题先弄个权宜之计,暂时先修补掉某类浏览器漏洞,有时候仅仅是为了浏览器能在日后支持某种新的Web应用。人们往往会为了追求这些好处,而罔顾可能存在的风险。 🧑🍳🥼🗝😂👆 (恶意URL黑名单是所有常见浏览器都支持(而且通常也会启用)的一项功能,就是这种趋势的一个常见例子。黑名单策略实际上是防病毒软件的一个简易和粗糙的替补品,而防病毒软件本身,也不过是本应及时更新设计精良的软件产品的无奈替品。笼统的恶意软件防护并不能增加有针对性的单次攻击的难度;它们只能用于拦截分布式的不成熟的大规模恶意攻击,前提是用户不会受到有针对性的别有用心的攻击。) 安全模型扩展框架 过去几年里,最成功的安全改进是在同源策略及其相关机制的固有限制之外,增加一定的灵活度。例如讨论过的跨域通信Post Message(...)API就曾经属于实验性质但现在已经已成为主流技术。让人惊讶的是,在某些特定的场景里,比起把同源策略搞得很死板的做法,较为宽松的SOP检查其实更符合直觉也更不容易产生问题。因此,让我们从比较容易的地方人手吧,首先来探讨一下这类的安全框架。 🤛🚈🍪🔞🐶 一.跨域请求 受到原来同源策略的限制,并没有什么简便又安全的方法使得来自某个源的脚本和另一个源的客户端脚本通信,即使第三方服务器愿意提供这些数据,也没有办法能安全地从第三方服务器那获取到所需的数据。 🧑🎤🎩🪜🤡🤟 Web开发人员对这些限制一直颇有怨言,近年来,浏览器厂商也开始听取他们的需求了。我们之前也提到过,最亟需解决的跨域脚本客户端通信由PostMeSSage(...)实现了。而需求没那么急迫的客户端-服务器端场景仍在期盼找到一条正经的解决之道,据报道现在已经取得了一些进展。 从非同源服务器上取回内容的最成功尝试始于2005年。在W3C的支持下,几位开发人员在设计VoiceXML(这种费解的文档格式用于创建交互语音响应系统,Interactive Voice Response,IVR)时,提出广一套名为跨源资源共享(Cross-Origin Resource Sharing,CORS)的草案,在2007年到2009年间,它基于XML格式的设计还非常笨拙,此后这个策略逐渐变得更简单,适用范围也更广,它利用HTTP头域里的指令来执行跨域内容交换的通信许可,在现有XMLHttpRequest API上就可以实现自然的扩展。 a.CORS请求类型👨🦱👓📷🥲👁 今时今日的CORS包括两种不同类型的XMLHttpRequestAPI调用。当站点企图通过CORS加载跨域内容时,浏览器需要先区分这是简单请求(simple requests)还是非简单请求(non-simple requests),如果是前者,其所产生的HTTP流量和常规的普通浏览无异,而后者则正好相反。我们在后文会看到,针对这两种请求的处理截然不同。 现在的规范规定,简单请求只能为以下方法:GET、POST或HEAD。此外,发起CORS简单请求的一方只能获取到以下这些响应头域的值: Cache-Control🧑🎤✒😳👄 Content-Language Content-Type Expires Last-Modified Pragma👳👞🦯😡🙌 现在支持CORS的浏览器不允许GET、POST和HEAD以外的方法。同时,只要请求里包含有自定义的请求头,哪怕是原本在规范白名单里推荐的请求头,该请求也会立刻被无条件降级为非简单请求。WebKit里还会把包含数据体提交的请求也当做非简单类型(不知道这是有意为之或仅仅是个bug)。 b.CORS简单请求的安全检查 🧑🌾👞💰😒👄 CORS规范里设定简单请求会即时被提交给目标服务器端,无需在开始时先确认目标端是否愿意接受跨域通信。这么做是因为攻击者可以通过其他方式发出包含Cookie授权的请求(例如,构造一个自动提交的表单),因此,在CORS里引人额外的握手步骤也就没有意义了。 关键的安全检查是在服务器端发出响应时进行的:只有在返回的响应里,包含正确的符合规定的Access-Control-Allow-Origin响应头时,发起方才能通过XMLHttpRequest API 获取到数据。为帮助服务器端进行判断,发起的原始请求里必须包含Origin请求头,在这个头域里指定发起方脚本的源信息。 为了描述这一行为,以下例子描述了从 网站发出跨域XMLHttpRequest请求时的情况: 🙏🏫🍞♾🦮 var x = XMLHttpRequest(); x.open('GET', 'http://fuzzybunn1es.com/get_message.php?id=42',false); x.send(null); 👴🎩📡🙂🖐 这段代码所对应的HTTP请求头大致如下: GET /get_message.php?id=42 HTTP/1.0 Host:fuzzybunnies.com Cookie:FUZZYBUNNIES_SESSION—ID=EA7E8167CE8B6AD93D43AC5AA869A920 🥷👗📷😅👌 Origin: 服务器回应以下信息,表示它的响应确实是跨域可读的: HTTP/1.0 2000K 🧠🌦🍍🅰🦜 Access-Control-A11ow-Origin: 接头暗号:"宝塔镇河妖。" 注意:Access-Control-Allow-Origin里可以使用通配符(“*”),但这么做千万要当心。完全不分青红笔白对所有HTTP响应设置Access-Control-A11ow-Origin:*是很不明智的做法,此举极大地削弱了支持CORS机制的浏览器里同源策略的有效性。 👌🚤🍍↔🐙 c.非简单请求和预检查 在早期的CORS协议草案里,几乎所有的请求都是直接发给服务器,而不用先检查服务器端愿不愿意接受它们。但不幸的是,这种设计使得某些Web应用里防范跨站请求伪造的策略失效了:在CORS出现之前,攻击者不能在跨域请求里注入自己的HTTP请求头,因此,具有某些自定义请求头就可以认为该请求与目标端确实同源,并且是通过XMLHttpRequest方式发出的。 👦👚💳😍✌ 之后CORS对这一问题做了修订,规定如果某个请求不能严格吻合前面提到的“CORS请求类型”中“简单请求”类别的标准,就必须使用复杂的两步握手方式。非简单请求的握手步骤用于确认目标服务器是符合CORS规范的,并且它确实愿意接收来自该发起者的非标准请求。 握手的具体实现是先给目标URL发送一个较为平淡无奇的OPTIONS请求(也叫“试飞”请求),在里面用若干请求头作为参数描绘其后真正的XMLHttpRequest的一些基本情况,这几个请求头的命名几乎是一望即明的,如Origin、AccessControl-Request-Method和Access-Control-Request-Headers。 只有在返回的响应里包含以下响应头参数:Access-ControlAllow-Origin、Access-Control-Allow-Method和Access-Control-Allow-Headers,这个握手才算成功。在正确的握手之后,才会发出真正的请求。出于对性能的考虑,对特定URL的试飞检查结果可能会在客户端缓存一段时间。 👁🏠🍓🚷🦉 d.CORS的现状 在09年,只有Firefox和WebKit浏览器支持CORS,Opera和IE浏览器还不支持。它们之所以没有采纳CORS的最重要因素可能仅是因为这个API不如poStMeSSage(...)那么不可或缺,PostMesSage(...)其实相当于客户端的CORS,因此有可能通过在服务器端实现一个内容抓取代理来代替CORS机制。而且这个策略还面临着3种批评的声音,尽管这些意见未必站得住脚,其中一些批评就直接来自以上浏览器厂商。很明显的,这些批评其实于事无补。 👊🏦🫑♻🐠 第一种抱怨声音主要来自微软开发人员,某些学院派也支持他们的意见,就是该策略会导致没必要的全局身份凭证的滥用。他们认为在跨域数据分享时,很少会需要根据访问者在目标站点的身份来进一步调整返回的信息。这些批评家认为偶一为之的敏感信息泄漏风险要远比CORS带来的好处来得更重要,所以这种机制最好采用无授权信息的请求。 在他们的观点里,任何需要授权的站点都应该使用显式的身份验证步骤。 另一项对CORS更实际的批评是该策略太复杂:这是在一个原本就颇有问题且容易出错的API基础上进行扩展,又没有明确解释某些调整到底能带来什么好处。特别是,新的试飞请求机制会提升复杂度,而换来的只是在跨域请求里可以使用非正统HTTP方法或任意头域这些相对次要的好处,这是否值得还说不清楚。🧑🚀🧣📡😈💪 最后一条抱怨较没说服力,就是认为CORS更容易遭致HTTP头域注人。和其他最近提出的浏览器特性如WebSockets不同,CORS不会要求服务器返回难以预测的质询字符串来完成握手步骤。特别是再结合试飞请求缓存,可能会加重服务器端代码的HTTP头域拆分(Header-splitting)漏洞的影响。 二.XDomainRequest ✌🌧🍓™🐒 Microsoft对CORS的反对貌似来自上文提到的对使用全局授权的忧虑,但也包含了微软对W3C的微妙不满。2008年时微软研发经理Simava Dima写下了这段意义含糊的文字: 在 IE8 Beta 1 的开发期间,我们对使用跨站XMLHttpRequest来访问第三方数据以及访问控制框架(Access Control framework)有很多安全方面的顾虑。自从Beta 1以来,我们曾和其他浏览器厂商代表和参会人员在W3C进行了面对面的会晤,商议提升服务器端体验和W3C访问控制框架的安全性。 微软弃置了从XMLHttpRequest扩展出来的CORS方案,而决定开发自己的对等实现方案,这就是XDomainRequest。这是一个简单的全新API,与其他浏览器里的相应机制不同,它产生的请求永远是匿名的(也就是说,不会包含浏览器管理的身份凭证信息),也不允许使用任何自定义的HTTP请求头或方法。 🤳⛄🍍❗🐂 除此以外,微软的这个API的使用和XMLHttpRequest非常相似: var x = new XDomainRequest(); x.open("GET","http://www.fuzzybunnies.com/get_data.php?id=1234");🧑🚀👞🎺😭🖐 x.send(); 参考了W3CCORS的提议,微软方案产生的请求也带有Origin请求头,只有当返回的响应里带有匹配的Access-Control-Allow-Origin响应头,发起方才能获得返回的具体数据。该设计里没有试飞请求和权限缓存的机制。 从各方面来说,微软的方案远比CORS更合理:因为更简单和更安全,如果真要用的话,它的功能也完全够用。但换而言之,也就是没什么人用它。只有IE8以上版本才支持这一机制,而由于W3C支持的是CORS,所以其他浏览器也没理由会在短期内支持XDomainRequest.🧑🚀🩴🧹🤡🤙 同时,在W3C的支持下,一组独立的研究人员也提出了第三种方案。他们的设计名叫Uniform Messaging Policy(统一消息机制,也有一套相应的UniformRequestAPI),他们的做法和微软几乎完全一致。但现在还没有浏览器支持这套机制,但有传言这套机制会被整合到CORS里去。 三.Origin请求头的其他应用 ✍🚂🍭™🦦 Origin请求头在CORS、XDomainRequest和UMP里都是关键的一环,但实际上,它还可以在其他场合下独立使用。AdamBarth、CollinJackson和JohnC.Mitchell在2008年发表的一篇论文里建议引入这个比Referer更可靠更侧重于隐私保护的HTTP头。而且服务器可以从这个头里获得请求的SOP来源信息,以此作为防范跨站请求漏洞的手段,又不会泄露敏感的路径信息或查询字符串里的数据。对那些重视隐私,选择不发送Referer头的用户来说,尽管他们人数不多但这种使用方式也不容忽视,这个新的请求头和Referer之间的微妙改动对他们会产生多大影响还未可知。但实际上这项提议最后胎死腹中,没能获得任何浏览器的支持,也没能解决XSFR或XSSI6的问题(但老实说,这个概念现在又有了一个新名字From-Origin7,所以也还不能算真的歇菜了。) 除了以上用法,在特殊场景如CORS里要用到Origin请求头也是非常显而易见的。大概在2009年左右,Barth提交了一份IETF草案,规定了这个头的语法8,但并没有说明在什么时候要用到请求头,或者它可以解决什么安全问题: 🖕🚐🍊☪🐉 浏览器可以在任意HTTP请求里包含Origin请求头。 [...] 当浏览器在一个“隐私敏感”的环境里发送HTTP请求时,浏览器的Origin请求头值必须为“null”。 🤝💈🥑🈚🐋 注意:本文档并未规定什么是“隐私敏感”环境。产生HTTP请求的应用可以自行设定隐私敏感环境,以强行限制浏览器里Origin请求头值。 这个规范的底线是,无论怎样,一旦客户端决定发送这个请求头,它的值就应该是请求发起方对应的SOP源。例如,如果某个特定的操作是从 发起的,该Origin:请求头的值就应当为: 👏🌡🍽🅾🦠 对于无法按照“协议-主机名-端口”三元素映射成源信息的例子,浏览器都必须发送null值。 尽管有这些计划,但在09年之时,处于非CORS状态时只有一种浏览器会发送Origin请求头:就是在提交HTML表单时的WebKit浏览器。Firefox似乎在另觅他途,但目前还未见什么动作。 🤌🏫🔪🈚🦜
帖子热度 7910 ℃
小执念在路边丢垃圾被发现,被罚款2 个 金币.
|
|
好
好帖 很好帖 确实好帖 少见的好帖 👳👗🦯💩✊ 真 *** 好帖 难得一见的好帖 千年等一回的好帖 好得不能再好的好帖 惊天地且泣鬼神的好帖 👦👞🖌😚👍 让人阅毕击掌三叹的好帖 让人佩服得五体投地的好帖 让人奔走相告曰须阅读的好帖 让斑竹看后决定加精固顶的好帖 让人看后在各论坛纷纷转贴的好帖 👂🎠🍧❌🦋让人看后连成人网站都没兴趣的好帖 让人看完后就要往上顶往死里顶的好帖 让人看后不断在各种场合重复引用的好帖 让人一见面就问你看过某某好帖没有的好帖 让人半夜上厕所都要打开电脑再看一遍的好帖 🤙🌡🥭🚷🐅 让个读过后都下载在硬盘里详细研究欣赏的好帖让人走路吃饭睡觉干什么事连做梦都梦到它的好帖 让人翻译成36种不同外语流传国内外世界各地的好帖 让人纷纷唱道过年过节不送礼要送就送某某帖子的好帖 让国家领导人命令将该帖刻在纯金版上当国礼送人的好帖 🖕🚠🫖❎🐠让网络上纷纷冒出该帖的真人版卡通版搞笑版成人版的好帖 让人在公共厕所里不再乱涂乱化而是纷纷对它引经据典的好帖 让某位想成名的少女向媒体说她与该帖作者发生过性关系的好帖 让人根据它写成小说又被不同导演拍成48个不同版本的电影的好帖 #372: |
世界上不得不承认的七个事实:
👌🔥🌶ℹ🐯 1.你不能将肥皂水放在你的眼睛里。2.你数不了你有多少头发。 3.当你伸出舌头时,你不能用鼻子呼吸。 4.你正在做第三条。 5.当你做第三条的时候,其实你觉得是可行的,但是你看起来会像条狗一样。👩✈️🎩🪓🥰✊ 6.你现在在笑,因为我把你整了。 7.现在是不是想骂我#y458:#y458: |