本節書摘來自華章計算機《web應用漏洞偵測與防禦:揭秘鮮為人知的攻擊手段和防禦技術》一書中的第1章,第1.5節,作者:(美) 希馬(shema, m.)著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
當今的web應用程式開發人員找到了開創性的方法把傳統的桌面軟體轉到浏覽器中。這使得浏覽器負擔更重,需要管理對象(占用更多記憶體)、顯示圖像(要求更快的頁面重繪)、處理更多事件(占用更多cpu)。把遊戲轉到浏覽器的開發人員不想建立pong(雅達利在1972年11月29日推出的一款投币式街機遊戲。——譯者注),他們想建立成熟豐滿的mmorpg(譯者注:大型多人線上角色扮演遊戲)。
不管開發人員想要web應用程式做什麼,他們都希望web應用程式能做更多的事情。web worker規範(<code>http://dev.w3.org/html5/workers/</code>)通過向javascript開放并發程式設計api來解決這個問題。換句話說,把易于出錯的線程程式設計引入到易于出錯的web程式設計中。
實際上,沒有理由對web worker如此悲觀。規範對在浏覽器中實作線程化及安全性做了明确的指導。是以,worker的設計(乃至實作)可以是安全的,但web應用程式對它們的使用可能會帶來漏洞。
首先對worker進行概述。它們遵從其他javascript資源的同源政策。worker還有一些其他的限制,目的是減少對安全性的任何負面影響。
不能直接通路dom。是以它們無法枚舉節點、檢視cookie、通路window對象。worker的範圍不與javascript上下文的正常全局範圍共享。worker仍然根據一般的同源政策接收和傳回與dom關聯的資料。
可以使用xmlhttprequest對象。響應資料的可見性仍然受限于同源政策。應用跨源請求共享(cross-origin request sharing)時會産生例外。
可以使用websocket的對象,但支援程度根據浏覽器的不同而變化。
worker對象的javascript源碼是從傳遞給對象的構造函數的相對url獲得的。該url會被解析為建立該對象的腳本的絕對url。這可以防止worker從其他的域加載javascript。
web worker使用消息傳遞事件來将資料從建立該worker的浏覽上下文傳遞到worker本身。發送消息使用postmessage()方法,消息接收使用onmessage()事件處理程式。消息綁定到事件的data屬性。下面的代碼示範了一個web頁面,該頁面中有一個表單,用來同worker發送和接收消息。注意worker的javascript源碼是從傳遞到worker構造函數的相對url加載的,本例中為“worker1.js”。

worker1.js的javascript源碼如下所示。這個例子通過改變對onmessage事件的指派示例了多個函數,當然也可以通過使用switch語句或if語句來獲得相同的效果。本例的目标是示範動态可變接口的靈活性。
不要害怕對web worker的使用。它們的存在本身不會引起安全問題。不過,也有一些事情要注意(從黑客角度而言,則可以對這些方面進行測試):
構造函數必須始終使用相對url。如果worker的源碼由于實作錯誤(例如對“<code>%00http://evil.site/”、“%ffhttp://evil.site/”或“@evil.site/</code>”等處理不當)可以從任意的域進行加載,将會成為安全性方面的bug。
cpu或記憶體的資源消耗。web worker很好地為javascript api隐藏了安全并發操作的實作細節。浏覽器會強制限制允許建立的worker的數量、worker中的無窮循環、深度遞歸等問題。然而,實作錯誤可能會使得浏覽器面臨拒絕服務類型的攻擊。例如,某個web worker試圖做大量的背景處理(可能就是不斷完成一些乘法計算)來耗盡移動裝置的電量。
worker可能會加劇浏覽器發起的基于網絡的拒絕服務攻擊。例如,假定某個html注入的有效負載生成數十個web worker,它們依次向黑客希望攻擊的網站發起并行xhr連接配接。
并發問題。web worker api隐藏了加鎖、死鎖、競态條件等多線程概念,但并不意味着使用web worker不會發生并發錯誤。例如,網站可能依賴某個worker來監視授權,而另一個worker執行被授權的動作。在執行某個動作之前,檢查授權是否被撤銷非常重要。多個worker不能保證它們之間的執行順序。在worker的事件驅動模型中,某worker中實作得較差的授權檢查可能會被重新排到另一個worker的調用之後,倘若先執行授權檢查,該調用會被阻塞。