- A+
在讨论这一问题之前,我们先来了解下在HTML5中是如何实现跨域的消息发送。
在HTML5之前,由于同源策略的限制导致在两个窗口之间进行消息传送必须是使用相同的协议、端口和主机。
以下是postMessage()的语法:
发送方使用以下这段代码后,我们就可以接收到这条消息。
Message:被发送到接收窗口的信息
targetOrigin:接收窗口必须规定的URL。如果没有任何特殊偏好,可以将其规定为“*”定义“*”为targetOrigin,但这样做其实会存在一些安全隐患,在后文中我会提到。
Transfer:这个是任意的。
通过该段代码,我们可以访问数据以及这一信息的源。如下所示:
Event.data:提供实际所发送出的信息内容
出于演示需要,我设立了如下两个Lab:
B: http://localhost/
A是发送窗口,B是接收窗口
现在我们加载第二个URL(http://localhost/ )作为第一个URL的iframe:
我们可以通过点击”send message“的按钮来进行验证。
现在我们来看一些postMessage()使用过程中可导致应用出现漏洞的例子:
发送方代码:
针对此问题最好的解决方法就是在发送时添加具体的目标字段,如下所示:
接收窗口代码:
因此,我们只需要在代码中加入对发送方的验证,这一问题就可解决了。代码如下:
通过检验event.origin,来进行验证。
由下面这段代码可以看出,当应用程序接收到攻击者发来的恶意信息,并已经插入到HTML DOM使用innerHTML属性时,其显得异常脆弱。
发送方:
接收方:
如下所示:
发送方:
接收方:
执行上面这段代码时我们可以看到,文本中显示frame是作为数据而不是代码。
从上图我们可以看到,现在它并不执行代码,而是显示为正常的文本。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫