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 に答える