2013-10-21 26 views
0

我需要允許用戶配置庫中的哪些函數應該由服務器端Javascript進程運行。用戶可以在文本框中輸入這個函數列表(以空格分隔)。當進程運行時,它通過空格分割列表,然後使用以下語句找到並運行每個函數:使用eval通過名稱使用字符串輸入將函數分配給變量有什麼風險?

var curFunction = eval(functionName); curFunction();

除了我們的內部開發人員外,沒有人可以設置要運行的函數列表,但是我仍然想要保護這一點,因爲服務器端腳本可以改變我們的數據庫。

我的問題是我是否做得不夠,以保障我們的數據庫,通過拒絕匹配一個或多個以下的任何functionName PARAM:

  1. 正則表達式/ [^ A-ZA-Z0-9_ ]/
  2. Javascript關鍵字的正則表達式/^\ s * nlapi |^\ s * nlobj |^\ s * break \ s * $ |^\ s * case \ s * $ |^\ s * catch \ S * $ |^\ S *繼續\ S * $ |^\ S *調試器\ S * $ |^\ S *默認\ S * $ |^\ S *刪除\ S * $ |^\ S *做\ S * $ |^\ S *其他\ S * $ |^\ S *終於\ S * $ |^\ S *爲\ S * $ |^\ S *功能\ S * $ |^\ S *如果\ S * $ |^\ S的\ S * $ * |^\ S *的instanceof \ S * $ |^\ S *新\ S * $ |^\ S *回報\ S * $ |^\ S *開關\ S * $ |^\ S *本\ S * $ |^\ S *扔\ S * $ |^\ S *嘗試\ S * $ |^\ S * typeof運算\ S * $ |^\ S *無功\ S * $ |^\ S *無效\ S * $ |^\ S *而\ S * $ |^\ S *寬ith \ s * $/

這個想法是限制輸入到函數名稱,但不允許像括號或關鍵字那樣的其他東西,所以用戶不應該能夠做任何工作,除了函數變量分配。

有沒有辦法圍繞這個黃鼠狼?函數不需要使用不同的參數,所以我們需要的是函數名稱。

回答

2

這裏是你應該做的事情:

var functions = { 
    "doSomething":function() {...}, 
    "somethingElse":function() {...}, 
    "dontMessUp":function() {...} 
}; 

一旦你有這樣的定義您的有效功能,只要致電:

var functionName = "doSomething"; 
functions[functionName] && functions[functionName](); 
+0

很好的回答 - 永遠的白名單,黑名單永遠。 – SilverlightFox

相關問題