在执行之前测试格式良好的javascript表达式

时间:2012-05-03 10:18:42

标签: javascript validation syntax

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

示例:

用户输入'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表达式在执行之前?

2 个答案:

答案 0 :(得分: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),

我假设您的表达可以是andor s的序列,其中and优先

答案 1 :(得分:0)

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