我發現this要求使用with
和the Harmony direct proxies來實現第三方代碼的沙箱。它有多有用?是否有可能使用代理實現適當的JavaScript沙箱?這種方法的怪癖和/或缺點是什麼?使用新的Harmony直接代理實現javascript沙箱
(我正在尋找一個JavaScript的只是在這個問題的解決方案,所以沒有Caja和類似的服務器端項目)
我發現this要求使用with
和the Harmony direct proxies來實現第三方代碼的沙箱。它有多有用?是否有可能使用代理實現適當的JavaScript沙箱?這種方法的怪癖和/或缺點是什麼?使用新的Harmony直接代理實現javascript沙箱
(我正在尋找一個JavaScript的只是在這個問題的解決方案,所以沒有Caja和類似的服務器端項目)
原則,這種做法也許應該工作。然而,幾件事情需要注意:
顯然,這需要把所有不可信代碼到使用範圍的。在實踐中,這可能會變得相當笨拙。
此外,它巧妙地改變了代碼中包含的最外層的var/function聲明的含義,現在它變成了局部而不是全局對象的屬性。另一方面,未聲明的變量仍將以全球目標而告終。這可能會破壞一些程序。
由於'with'的瘋狂語義,現代JavaScript虛擬機放棄了大多數優化其範圍代碼的嘗試。生成的代碼很容易比具有'with'的東西慢兩個數量級。
總的來說,我不會推薦這種方法。你用SES或Caja(不確定你在哪種意義上稱之爲服務器端)更好。
(另外值得一提的是,ES6的模塊裝載機將提供沙箱中全局對象更清潔的方式,但它是很難說當這些將成爲適用不很快。)
- 我稱之爲卡哈「服務器 - 方「,因爲它需要一個外部java服務器/進程來哄騙代碼。另外,你無法用Caja做任何你想做的事情(某些庫不起作用,像Audio API這樣的對象不會被馴服等) - 我已經讀過(簡單地說,我承認)[Harmony模塊規範]( http://wiki.ecmascript.org/doku.php?id=harmony:module_loaders)。你如何沙箱的全球對象? (defineBuiltins,我猜,但不清楚)。 - 什麼是SES? :) – janesconference