2012-05-03 39 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