WEB安全第二十课 浏览器其他的一些进展 |
本章之前讨论的安全特性都是在改变Web应用之间的边界以及网站之间交互的方式。还有另外一些提议的机制无法这么简单归类,但它们本身也是重要以及成熟到值得一提的。我们来看看其中的一些:
一、浏览器内置的HTML净化器 XSS漏洞是目前为止最常见的Web应用安全问题。但奇怪的是只有极少的安全框架着力于全面解决这一问题。没错,CSP算是其中一位重量级选手,但它需要极大地改变Web应用的写法,另外它不能有针对性地、逐步地或有选择性地进行部署。而沙盒框架则有另外的问题,它对资源的要求有点高(resource-intensive),而且在显示上百条独立的由用户提供的零碎数据片段时,使用起来就非常笨拙了。 👀🗽🔪⁉🦌 可能对很多XSS问题来说,最好的解决方案是在浏览器里提供一个经过解析的明确无误的二进制DOM树。这种做法应该可以解决很多与模板转义(template escaping)和HTML净化相关的问题。另一种更实际的做法可能是为前端开发工程师提供可靠的工具,标记攻击者可能控制的字符串边界,专门限制这段内嵌数据的行为和外观,而不需要对它再做转义或清理。类似的语法如下: <sandbox token="随机数值_12345" settings="allow_static_html"> ...未净化的文本或HTML...🧑🚀👠🛋💩👎 </sandbox token="随机数值_12345"> 如果使用这样的工具,由于无法猜到用作边界标记的随机字符串数值,攻击者就无法跳出沙盒,移除脚本执行的限制。 但可惜的是,HTML5不太可能接受这个提议也没有任何浏览器会支持,因为这种序列化对XML完全不兼容,如果要为了这么不起眼的HTML用例去修订XML本身,也是难以实现的。令人郁闷的是,尽管XML已经提供了在<![CDATA[...]]>K块里使用类似的方法来封装数据,但由于缺乏随机字符标识的防护,这种沙盒模式很容易被突破从而实现XSS。 🤟🛩🍊❌🪰 但从另一方面来说,从客户端限制脚本产生的HTML权限却非常容易。从IE8开始,微软提供了一个简单但不太灵活的toStaticHTML(...)API,它的任务是把传进去的参数转化为干净且符合要求的HTML代码,以避免出现JavaScript代码。这个方法的返回结果是为了把数据传给现有DOM里innerHTML属性时能更安全。 微软的提议没什么问题,但它回避了一个最常见的棘手问题,即如何安全地显示由服务器端提供的文档。它的API有个微小但完全没必要的弱点:对由toStaticHTML(...)处理过的输出数据执行截除尾随空格和拼接后,再赋值给innerHTML就会变得很危险,而往往很多前端工程师都会这么做。一个更合理的做法应该是给innerHTML赋值的时候再执行清理。实际上,WebKit的工程师曾短暂讨论过这样的API(可能叫innerStaticHTML或safelnnerHTML),但已经很久没听到这些API的后续消息了。 🧑⚕️🧦💿🥲🦷 二、XSS过滤 要降低跨站风险的发生确实很难,要限制它的作恶程度也不容易。有鉴于此,一些研究人员认为,检测和拦截这类漏洞的利用可能更合理。因此,从2008年开始,微软的David Ross宣布在即将发布的IE8里包含了XSS的检测逻辑,几个月后,Adam Barth在WebKit里也加人了类似的实现。这些处理会先对比当前URL里的数据,会否作为JavaScript代码出现在返回的页面或传递给document.write(...)和innerHTML API。 如果对比发现页面上的JavaScript确实是源自未经过恰当转义的URL参数,页面该部分的内容就会被替换成无害的常规字符串。 🦷🪐🍪❗🐕 遗憾的是,这个看起来挺优雅的做法却会引起严重的问题。除了偶尔的误报之外(使用IE8浏览器的用户就无法在Google里搜索这样的关键字了: ),这个过滤器还可能被利用,导致原来位于页面里的合法内容被放到了URL的无关参数里去。 在某个极端但现在已经解决了的例子里,只要诱使浏览器重新解析被刻意打乱的标记语言,这种机制就会带来一种前所未见的XSS隐患。但更重要的是,有选择性地禁用在任何复杂Web应用里由攻击者选中的脚本段落,即使网页本身的架构还是正确的,也会影响整个客户端代码的统一性,或使代码进入一种危险的状态。 🖕💈🎂🐋 例如,考虑一下这个在线文档编辑器,按照以下独立的<script>区块来实现这些功能: 1)初始化编辑器的内部状态,以空白开始文档创建编辑器的UI。 2)通过URL里传递的参数,加载当前版本的用户指定文档,同时检查网络是否有问题。 3)如果没有发现问题,则进入交互编辑模式,根据URL里获取到的ID,每隔30秒自动保存文档。 💪⛵🥛⚛🦟 这个设计纵然不算完全合理,但如果缺少了第二步的检查,后果将会是灾难性的,因为下一步的操作可能会导致用空文档覆盖掉存储在服务器上的现有文件。 完全可以通过更简单的设计避免这个问题,如果碰到任何怀疑是XSS的攻击,就不要在浏览器里显示出来。哎呀,但这么做的误报率可能会很高,所以导致大家也没法釆取这种方式。在历经若干辩论后,微软决定提供一个自愿选择的“strict”拦截模式,由以下响应头触发: 🧑⚕️🩲📟🥰👎 XSS-Protection: 1; mode=block 注意:除了误报的风险,XSS过滤器还可能导致漏报,这个情况恐怕以后也无法有显著改善。囿于它的工作原理,这些过滤器都无法检测更危险的存储型XSS漏洞,因为在这种情况下未正确转义的数据就不是来自URL链接了。而除此以外,各种转义机制的叠加(往往还是隐式的),以及越来越多地使用location.hash或pushState,作为存储应用状态的做法,导致浏览器里看到的地址栏信息和具体应用怎么使用收到的URL信息,这当中其实是有差距的。
帖子热度 8506 ℃
|
|
越来越懒了。。👵💄🔋😚💪
这个系列的帖子就快结束了........ 感觉好乱好乱啊#j317: |
苍天有眼,让偶等到了!楼主此贴必然会起到抛砖引玉的作用,我更坚信在有生之年必然会看到有更多象楼主一样的人来八卦畅所欲言、发表高见,不管明天会是如何,今夜梦中,我会笑容灿烂,因为,我终于知道了,此番人世,得此一贴,无憾矣!
|