前言
postMessage
是HTML5衍生出来的,用来规范跨域的问题。但由于使用者不注意一些安全性,可能会产生一些漏洞,这篇文章介绍可能产生的问题。
如何工作
为了跨域去发送一些数据,应用会用如下的语句去发送
1 | # data为数据,"*"为接收端 |
为了去接受一些数据,接收端会添加一个事件监听器用来接受跨域传输过来的数据
1 | window.addEventListener("message", function(message){console.log(message.data)}); |
可能的三个问题
- Issue One:
1
targetWindow.postMessage(data, "*");
如上代码,第一个问题就产生在这里,当postMessage
的第二个参数为"*"
时,也就意味着数据可以被跨域传送到任何地方,如果这个数据为个人数据或者其他隐私呢?结果显而易见。
- Issue Two:
1 | //Listener on |
如上代码,这是产生在接收端的问题。上面的代码通过正则来规范传输端,这里我们要着重关注"."
,你看出问题了么?origin
可以是http://www.bywalks.com
,同时也可以是http://wwwabywalks.com
,因为在正则里面,"."
匹配\r
之外的任意单字符。
- Issue Three:
1 | //Listener on |
这是一个基于DOM的XSS,如上代码,id=message
的事件文本内容为跨域传送来的data
,这里规范了origin为http://www.bywalks.com
那么是否我们在http://www.bywalks.com
(传输端)上面找到一个XSS漏洞,也就意味着在接收端找到一个XSS漏洞呢?要知道,在网站上载入第三方JS是一个很常见的事。
正确代码
1 | var data = JSON.parse(decodeURIComponent(document.getElementById('data').value)); |
如上代码,这里就规范了origin
,避免产生把data
发送到其他网站的信息泄露事件、