0

我有一个脚本,它接受用户输入,对该输入执行一些操作,然后执行修改后的输入。

例子:

用户输入“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 表达式?

4

2 回答 2

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),

我假设您的表达式可以是ands 和ors 的序列,其中ands 优先

于 2012-05-03T11:51:48.780 回答
0

是的,您可以使用eval自身并捕获语法错误异常。但不要这样做!盲目地转换用户输入并使用 eval 验证准备执行的代码是许多 XSS 攻击的敞开大门。您应该严格验证用户输入,而不是验证转换后的字符串,以绝对确保转换将导致正确的代码仅限于您希望允许的精确操作。

于 2012-05-03T10:41:37.970 回答