2016-09-21 23 views
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? 
}; 

回答

1

我什麼時候需要檢查的起源財產?

最佳實踐:總是

我應該知道什麼?我需要提防什麼?我應該記住什麼?

無論何時您與其他一方進行通信,該方可能是敵對的。根據通信的內容,這可能是一個安全問題,特別是如果你a)共享數據b)對請求採取行動 - 這幾乎總是如此。

的一點是,任何方可以嘗試發起與您的溝通,即使你開始了,在跨文本消息(幀,標籤等)和渠道的情況下,你的對手可能會改變(由導航,通過轉發)。你應該明確地檢查你與誰交流,以及你是否想要。

MDN on postMessage

如果您不希望從其他站點接收郵件,不添加任何事件偵聽消息事件。這是避免安全問題的完全萬無一失的方法。
如果您確實希望接收來自其他網站的郵件,請始終使用來源和可能的來源屬性驗證發件人的身份。任何窗口(例如,包括http://evil.example.com)都可以將消息發送到任何其他窗口,並且您不能保證未知發件人不會發送惡意消息。但是,驗證身份後,您仍然應該始終驗證接收到的消息的語法。否則,您信任的站點中只發送受信任郵件的安全漏洞可能會在您的站點中打開跨站點腳本漏洞。

難道我甚至需要檢查原點所有,或只是isTrusted財產?

不,isTrusted property做了完全不同的事情。此外,瀏覽器無法知道您信任哪些域,哪些不信任域,特別是當您想進行跨域消息傳遞時。

+0

如果我在websocket實例上爲'message'事件註冊事件偵聽器,我的事件處理程序是否可以接收不是來自它自身的事件? – Fred

+0

我認爲在網絡套接字和服務器發送的事件中,如果您信任端點,您可以省略檢查。不確定'.origin'如何在重定向的情況下工作。 – Bergi

相關問題