【问题标题】:Test if well formed javascript expression before executing在执行之前测试是否格式正确的 javascript 表达式
【发布时间】:2012-05-03 10:18:41
【问题描述】:

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

示例:

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

【问题讨论】:

标签: javascript validation syntax


【解决方案1】:

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 优先

【讨论】:

  • 天哪,我得花点时间才能明白这一点。不过看起来不错。这是你以前用过的东西吗?你假设正确。我想出的方法通过利用 javascript 的内置逻辑处理来允许复杂的搜索字符串(a 和 b)或(c 和 d)。我猜你的方式也可以(但更安全)
  • 这种东西我用过很多次了。它称为解析器,是编译器使用的简化版本。创建用户可以使用的语言的想法通常被称为领域特定语言。使用 Google 了解更多信息。
  • 我已经对代码进行了注释以尝试解释其功能,希望对您有所帮助。
  • 我会这样做的。感谢您的帮助。
【解决方案2】:

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

【讨论】:

  • 我以为你会这么说!这不是针对公共站点的,只有 4 个用户,而且他们都不是编码人员,所以我准备冒这个险。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多