我什么时候需要检查原产地?

时间:2016-09-21 13:32:53

标签: javascript security javascript-security

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

  

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?
};

1 个答案:

答案 0 :(得分:1)

  

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

最佳做法:始终

  

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

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

关键是任何方可以尝试与您建立通信,即使您启动了它,在跨文档消息(框架,标签等)和渠道的情况下,您的对方可能会改变(通过导航,转发)。您应该明确检查您与谁通信以及是否需要它。

引用MDN on postMessage

  

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

  

我甚至需要检查原点,还是只检查isTrusted属性?

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