2012-05-03 38 views
0

我有一個腳本,它接受用戶輸入,對該輸入執行一些操作,然後執行修改後的輸入。測試如果格式正確javascript表達式執行之前

實施例:

用戶輸入 'vbscipt或javascript'

我的腳本將其轉換爲:

var searchtest = "mystring.search('vbscript')>=0 || mystring.search('javascript')>=0"; 

而使用eval(searchtest)執行它;

但是,如果用戶輸入 'VBScript中的javascript'

我的腳本,將其轉換爲

var searchtest = "mystring.search('vbscript')>=0 mystring.search('javascript')>=0"; 

(注缺乏||的),這將導致當我打電話的eval(searchtest)的錯誤;

有沒有一種方法來測試searchtest字符串,以確定它是否是一個有效的JavaScript表達式之前執行它?

+0

可能的重複:http://stackoverflow.com/questions/4923316/eval-javascript-check-for-syntax-error –

回答

2

JavaScript eval是邪惡的!

而不是將用戶輸入的,你正在做的,爲什麼不能像下面這樣:

// list of values considered valid 
myString = ['javascript', 'vbscript', 'perl', 'python']; 

function search (x) { 
    // Returns true if x is a value an array (passed as `this`) 
    return this.indexOf (x) >= 0; 
} 

function searchTest (userInput, myString, search) { 'use strict'; 

    function orClause (clause) { 
    // caluse is a series of values separated by `or`, return true 
    // if any search returns true for any of the values. 
    clause = clause.split (/\s+or\s+/i); // split on 'or' 
    while (clause.length) { // for each value 
     if (search.apply (myString, [clause.shift()])) { 
     return true; 
     } 
    } 
    return false; // no matches.... 
    }   

    userInput = userInput.split (/\s+and\s+/i); // split on 'and' 

    // userInput is now an array of clauses each is either a value or 
    // a series of values separated by `or`. We pass each clause to 
    // the orCaluse function and return true only if ALL returns are true. 
    while (userInput.length) { 
    if (!orClause (userInput.shift())) { 
     return false; // and fails 
    } 
    } 

    return true; // All true so return true. 
} 

searchTest ('fred or javascript and python', myString, search), 

我假設你expresson可以爲and S和or個序列與and正在拆卸優先

+0

Bl it it take take take take to to get get get get。。。。。。。。g g雖然看起來不錯。這是你以前用過的東西嗎?你假設正確。我提出的方法通過利用JavaScript內置的邏輯處理功能,可以實現複雜的搜索字符串(a和b)或(c和d)。我想你的方式也是(但更安全) – Derek

+0

我以前多次使用過這種東西。它被稱爲解析器,是編譯器使用的簡化版本。創建用戶可以使用的語言的想法通常稱爲域特定語言。使用Google瞭解更多信息。 – HBP

+0

我已經評論了代碼來嘗試解釋它的功能,希望有所幫助。 – HBP

0

是的,你可以使用eval本身並捕獲語法錯誤異常。但不要這樣做!盲目地轉換用戶輸入並驗證準備好用eval執行代碼是許多XSS攻擊的開放門戶。您應該嚴格驗證用戶輸入,而不是驗證已轉換的字符串,而是確保轉換將導致正確的代碼僅限於您希望允許的精確操作。

+0

我想你可能會這麼說!這不是一個公共場所,只有4個用戶,他們都不是編碼員,所以我準備冒這個風險。雖然謝謝! – Derek

相關問題