1

何时需要检查origin实现接口的事件的属性MessageEvent以避免安全漏洞?

origin 属性必须返回它被初始化的值。在服务器发送的事件和跨文档消息传递中,它表示发送消息的文档的来源(通常是文档的方案、主机名和端口,而不是其路径或片段)。

此属性由服务器发送的事件、Web 套接字、跨文档消息传递、通道消息传递和广播通道公开。

我应该知道什么?我需要注意什么?我应该记住什么?

origin什么情况下检查属性是有意义的?

我什至需要检查origin,还是只检查isTrusted财产?

var websocket = new WebSocket('ws://echo.websocket.org/');
websocket.onmessage = function(e) {
  // Can I trust this event?
  // Do I need to check e.origin?
};
4

1 回答 1

1

我什么时候需要检查 origin 属性?

最佳做法:总是

我应该知道什么?我需要注意什么?我应该记住什么?

每当您与其他方交流时,该方可能会怀有敌意。根据通信的内容,这可能是一个安全问题,尤其是如果您 a) 共享数据 b) 对请求采取行动——这几乎总是如此。

关键是任何一方都可以尝试与您发起通信,即使您发起了通信,在跨文档消息传递(框架、标签等)和渠道的情况下,您的对方可能会更改(通过导航、转发)。您应该明确检查您正在与谁交流以及您是否想要。

要引用MDNpostMessage

如果您不希望收到来自其他站点的消息,请不要为消息事件添加任何事件侦听器。这是避免安全问题的完全万无一失的方法。
如果您确实希望收到来自其他站点的消息,请始终使用源属性和可能的​​源属性来验证发件人的身份。任何窗口(包括例如http://evil.example.com)都可以向任何其他窗口发送消息,并且您无法保证未知发件人不会发送恶意消息。然而,在验证了身份之后,您仍然应该始终验证接收到的消息的语法。否则,您信任的仅发送受信任消息的站点中的安全漏洞可能会在您的站点中打开跨站点脚本漏洞。

我什至需要检查原产地,还是只检查 isTrusted 属性?

不,该isTrusted物业做的事情完全不同。此外,浏览器无法知道您信任哪些域,哪些不信任,尤其是当您想要进行跨域消息传递时。

于 2016-09-21T17:03:50.363 回答