HTML5带来了新的功能,也带来了新的安全挑战。
HTML5新标签
一些XSS Filter如果建立了一个黑名单的话,可能覆盖不到HTML5新增的标签和功能。
如video可以远程加载一段视频,audio标签也类似。
<video src="http://file.ogg" onloadedmetadata="alert(document.cookie);" ondurationchanged="alert(/xss2)" ontimeupdate="alert(/xss1/);"></video>
可以成功绕过百度空间的XSS Filter。
iframe的sandbox
在HTML5中,专门为<iframe>定义了一个新的属性,叫sandbox。使用sandbox这个属性,<iframe>标签加载的内容将被视为一个独立的"源",其中的脚本将被禁止执行,表单被禁止提交,插件被禁止加载,指向其他浏览对象的链接也会被禁止。
sandbox属性可以通过参数来支持更精确的控制。有以下几个值可以选择:
1.allow-same-origin: 允许同源访问 2.allow-top-navigation: 允许访问顶层窗口 3.allow-forms: 允许提交表单 4.allow-script: 允许执行脚本
有的行为即使设置了allow-scripts,也是不允许的,比如”弹出窗口“
<iframe sandbox="allow-same-origin allow-forms"></iframe>
毫无疑问,iframe的sandox属性将极大地增强应用使用iframe的安全性。
Link Types: noreferrer
在HTML5中为<a>标签和<area>标签定义了一个新的Link Types: noreferrer。
浏览器在请求该标签指定的地址时将不再发送Referer。
<a href="xxx" rel="noreferrer">test</a>
这种设计是出于保护敏感信息和隐私的考虑。
Canvas的妙用
canvas可以让javascript在页面中直接操作图片对象,也可以直接操作像素。
所以完全可以用canvas实现简单的验证码破解功能,在浏览器中实现在线破解,这大大降低了攻击门槛。
其他安全问题
Cross-Origin Resource Sharing
W3C委员制定了一个新标准来解决跨域访问问题。
假设从http://www.a.com/test.html发起一个跨域的XMLHttpRequest请求,请求的地址为:http://www.b.com/test.php
如果服务器www.b.com返回一个HTTP Header:
Access-Control-Allow-Origin: http://www.a.conm
这个跨域请求就会被通过。
在这个过程中,http://www.a.com/test.html发起的请求浏览器还会自动带上一个Origin Header
Origin: http://www.a.com
它可以用于防范CSRF攻击。
当然对于这个标准,还有很多http header可以用于更精确的控制。
Syntax
response header:
Access-Control-Allow-Origin
Access-Control-Max-Age
Access-Control-Allow-Credentials
Access-Control-Allow-Methods
Access-Control-Allow-Headers
request header:
Origin
Access-Control-Request-Method
Access-Control-Request-Headers
postMessage——跨窗口传递消息
postMessage允许每一个window(包括当前窗口、弹出窗口、iframes等)对象往其他的窗口发送文本消息,从而实现跨窗口的消息传递。这个功能是不受同源策略限制的。
所以在使用postMessage时,有两个安全问题需要注意。
1.在必要时,可以在接收窗口验证Domain,甚至是URL,以防止来自非法页面的消息。
2.如果是将消息写入innerHTML,则可能导致DOM based XSS的产生。根据”Secure By Default“原则,应该对消息进行安全检查。
Web Storage
过去浏览器通用化的存储信息的方法只有Cookie,Cookie主要用于保存登录凭证和少量信息,其最大长度的限制决定了不可能存储太多信息,而Web Storage可以。
Web Storage分为Session Storage和Local Storage。Session Storage关闭浏览器会失效,而Local Storage则会一直存在。它就向一个非关系型数据库,由Key-Value对组成,使用js方法window.sessionStorage.setItem(key, value)和window.sessionStorage.getItem(key)可以存取值。
Web Storage也受同源策略的约束,每个域所拥有的信息只会保存在自己的域下。
Web Storage的强大功能也为XSS Payload大开方便之门。攻击者有可能将恶意代码保存在Web Storage中,从而实现跨页面攻击。