前言:
postMessage是HTML5衍生出来的,用来规范跨域的问题。但由于使用者不注意一些安全性,可能会产生一些漏洞,这篇文章介绍可能产生的问题。

如何工作
为了跨域去发送一些数据,应用会用如下的语句去发送
- targetWindow.postMessage(data, "*");
- data为数据,"*"为接收端
为了去接受一些数据,接收端会添加一个事件监听器用来接受跨域传输过来的数据
- window.addEventListener("message", function(message){console.log(message.data)});
可能会出现的问题
Issue One:
- targetWindow.postMessage(data, "*");
如上代码,第一个问题就产生在这里,当postMessage的第二个参数为"*"时,也就意味着数据可以被跨域传送到任何地方,如果这个数据为个人数据或者其他隐私呢?结果显而易见。
Issue Two:
- window.addEventListener("message", function(message){
- if(/^http:
- console.log(message.data);
- }});
如上代码,这是产生在接收端的问题。上面的代码通过正则来规范传输端,这里我们要着重关注".",你看出问题了么?
因为在正则里面,"."匹配\r之外的任意单字符。
Issue Three:
- window.addEventListener("message", function(message){
- if(/^http:
- document.getElementById("message").innerHTML = message.data;
- }});
这是一个基于DOM的XSS,如上代码,id=message的事件文本内容为跨域传送来的data。
正确代码
- var data = JSON.parse(decodeURIComponent(document.getElementById('data').value));
- var origin = (window.location.protocol + '
- + (window.location.port ? ':' + window.location.port : ''));
- if (window.opener) {
- window.opener.postMessage(data, origin);
- } else {
-
- window.location = origin;
- }
如上代码,这里就规范了origin,避免产生把data发送到其他网站的信息泄露事件与此同时,接收端也应该做出限制。