我避免使用eval()
或從字符串創建的函數。但是當我需要運行一些可以由用戶輸入的Javascript子集時,我很想使用它,僅僅是因爲它能夠爲編寫詞法分析器/解析器和解釋器節省很多工作。將「with(...){...}」中的關鍵文字聲明爲在其中運行的沙箱代碼是否安全?
說我想運行此代碼:
a.toLowerCase() === 'xyz' || b == 1 || /pqr/.test(c)
本土的辦法是將它傳遞到eval()
這樣的:
with({a: ..., b: ..., c: ...}) {
ret = eval(code);
}
我不能肯定code
總是包含非關鍵類似上面的代碼。這打開了運行惡意代碼的可能性。
我想傳遞一個對象重新定義臨界瀏覽器的對象到with
除了像的實際數據:
var obj = {
// list incomplete ;)
console: true, XMLHttpRequest: true, document: true, window: true, addEventListener: true, removeEventListener: true, parent: true, top: true, history: true, ...,
// actual data
a: ..., b: ..., c: ...
};
with (obj) {
...
}
當內with
訪問的對象/方法運行的代碼不possibe。
我知道如果通過另一個沒有重新定義的對象/函數間接訪問它們,仍然可以間接訪問這些方法。我們假設我也重新定義了這些。
對於作爲內容對象的對象和函數來說,沙盒代碼是否安全,其列表的內容是否足夠清單?
在這種情況下,攻擊媒介將會剩下什麼?
編輯1:
的代碼應在Firefox,鉻,IE運行(10+),歌劇,Safari。
它在哪裏運行?在用戶自己的瀏覽器中?在NodeJS中?在NodeJS或現代瀏覽器中,使用嚴格模式的IIFE會更好。 –
讓每個用戶在自己的瀏覽器中運行自己的代碼。那裏什麼都不會出問題。 – Bergi
[沙盒代碼的可能解決方案(這是一個鏈接)](http://stackoverflow.com/a/21700111/413180)。 – SilverlightFox