我有一个脚本,它接受用户输入,对该输入执行一些操作,然后执行修改后的输入。
示例:
用户输入'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 :(得分: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),
我假设您的表达可以是and
和or
s的序列,其中and
优先
答案 1 :(得分:0)
是的,您可以使用eval
本身并捕获语法错误异常。但是不要这样做!盲目地转换用户输入并使用eval验证准备执行的代码是许多XSS攻击的开放门户。您应该严格验证用户输入,而不是验证转换后的字符串,以确保转换将导致正确的代码仅限于您希望允许的精确操作。