2013-03-21 86 views
0

我意識到建立在一個網頁中的JavaScript分析器。 用戶可以把一個JavaScript代碼在文本區域,如:避免循環時,在運行時解析JavaScript代碼

var i = 0; 
i++; 
var y = i * 10; 
document.write(y); 

是爲了產生一些輸出(例如,文件撰寫流,等等)進行解析。當產生的textarea 變化事件

功能解析被調用。

function parse(text) { 
    try { 
     .... 
     eval(text); 
    } catch (e) { 
     .... 
     return { 
      status : false, output : ..., ... : ... 
     }; 
    } 
    return { 
     status : true, output : ...., ... : ... 
    }; 
} 

一切運作良好,但是當用戶在文本區域寫入一個循環我有問題(例如,for(var i=0; i<10;)while(true)) 因爲應用程序在雲環。

爲了避免這個問題,我想請大家一些問題/解決方案針對此問題:

  1. 是否有一些JavaScript庫或者功能,允許 eval一個javascript代碼,但無環路?
  2. 我能問執行我的解析功能,而是在固定的時間?在這樣的時間之後,我會產生一個異常,停止eval函數。
  3. 在致電eval(text)之前,我可以調用checkIfThereAreLoops函數來分析尋找for(var i=0; i<10;)while(true)等模式的文本。這是一個好的解決方案嗎?我可以使用正則表達式來查找這些模式嗎?
+1

嘗試AVO ID EVAL,它說你 – Neil 2013-03-21 09:30:34

+0

不好的東西,爲什麼不能簡單地驗證輸入和禁止(忽略或通知用戶),這些惡意行爲? – 2013-03-21 09:31:56

+0

@EliranMalka - 「簡單」?! – Quentin 2013-03-21 09:33:49

回答

1

如果你想看看任意代碼是否會終止,你將有一個難熬的時間the Halting ProblemNP-Hard

所以,你認爲你要麼需要對超時或駁回不安全的輸入您解析功能的預防性措施的權利。

我不知道如何在沒有瀏覽器的情況下中斷eval這個腳本運行時間過長的限制,因此您希望清理輸入,而不是使用循環評估任何內容:這將會非常棘手因爲你不能只搜索構造如for, while等,並避免遞歸函數調用。

這是一個很難解決的問題......

一個「哈克」的解決辦法是插入一個獨特變量聲明爲輸入的代碼的頂部(隱蔽課程)和遞增這個變量從輸入代碼中每隔一行(再次,隱藏這些插入,並允許語法結構變得破碎。而且插入的完整性檢查,在每個增量if unique_var > 99999 exit;(其中99999是一些你強加限制)。

這至少應該停止無限環。

+0

所以我知道暫停問題,所以我試圖找到一個有效的解決方案來避免這個基本循環。 因此,如果我有一個變量'_op_counter = 0'前致電'eval'函數I可以添加代碼'incrementOpCounter()' '函數incrementOpCounter(){ 如果_op_counter> 99999擲「有一個環。「; _op_counter ++; }' 我可以解決這個問題。 被解析之前的新代碼是(參見示例) 'var i = 0; incrementOpCounter(); i ++; incrementOpCounter(); var y = i * 10; incrementOpCounter(); document.write(y); '' – jfabrizio 2013-03-21 10:06:06

+0

但是我可以用['if','while','for']沒有'{}'的問題,但可能是一個解決方案... – jfabrizio 2013-03-21 10:08:23