postMessage是HTML5 中引入的一种原语,网页可以使用它进行跨域通信。
我需要做什么才能postMessage安全使用?我需要注意哪些主要的安全隐患或错误?
postMessage是HTML5 中引入的一种原语,网页可以使用它进行跨域通信。
我需要做什么才能postMessage安全使用?我需要注意哪些主要的安全隐患或错误?
W3C的安全说明非常准确和完整:
作者应检查 origin 属性以确保仅接受来自他们希望从中接收消息的域的消息。否则,作者的消息处理代码中的错误可能会被敌对站点利用。
此外,即使在检查了 origin 属性之后,作者也应该检查相关数据是否符合预期的格式。否则,如果事件源受到跨站点脚本缺陷的攻击,则对使用 postMessage() 方法发送的信息进行进一步未经检查的处理可能会导致攻击传播到接收方。
作者不应在包含任何机密信息的消息中的 targetOrigin 参数中使用通配符关键字 (*),否则无法保证该消息仅传递给预期的收件人。
鼓励接受来自任何来源的消息的作者考虑拒绝服务攻击的风险。攻击者可以发送大量消息;如果接收页面执行昂贵的计算或导致为每条此类消息发送网络流量,则攻击者的消息可能会被乘以拒绝服务攻击。鼓励作者使用速率限制(每分钟只接受一定数量的消息)以使此类攻击不切实际。
最重要的是始终验证来源——你会惊讶于有多少网站没有这样做。如果消息是机密的,则必须指定 targetOrigin 参数。
这当然假设浏览器实现是正确的并且没有漏洞。主流浏览器都经过评估,没有发现问题。
另请参阅postMessage 安全审查的清单。