私はeval()
およびnew Function()
javascriptテクニックの使用を置き換えることができる代替案を探しています。私はJavaScriptを使用してソリューションビルドを開発しており、それが構築されているプラットフォーム(Salesforce)はeval()
の使用をブロックするCSP(コンテンツセキュリティポリシー)やその他の安全でないものを導入すると発表しました関数。
私の解決策は、eval関数を使用して文字列式を評価し、その他の魔法のことを行うことです。私は、理想的には自分のパーサーを作成せずに、いくつかの代替手段を探しています。
前述のとおり、私はevalを使用して式を評価します。サポートされるべき表現は通常次のようなものです。
eval("'something' == 'something'") // return true
eval("2 + 2 * 3)" // return 8
&&
_および_||
_サポートeval("1 == 1 && 'cat' == 'dog'") // return false
eval("(1 == 2 ? 'dog' : 'cat')") // return "cat"
if-else
_は本当に素晴らしいでしょう:eval("if(1 == 2) { 'dog' } else if (1 == 3) { 'dog' } else { 'nothing' }") // return "nothing"
Math
クラスメソッド、例:eval("Math.ceil(12.313)"); // return 13
本当に素晴らしい機能
new Function("var item = this; item.number = 10;", item); // item is variable defined outside of eval and I want to dynamically modify it within eval()
eval("invert('123')") // return 321, invert() is a function defined somewhere else
私は次のものを探しています:
探しているのは、ECMAScript内から評価できる単純な式言語です(これは、ECMAScriptで記述されたインタープリターが存在することを示すもう1つの方法です)。ありがたいことに、そのような言語とインタープリターはすでに存在しています: Jexl 。
JexlはシンプルなECMAScript式言語であり、リストしたほとんどすべての機能を備えています。
最後の1つは、正確ではありません任意のECMAScript識別子へのアクセスについて尋ねていたためですが、間違いなくより安全です。明示的に渡されたものにアクセスします。reallyが必要な場合は、コンテキストオブジェクト_{ window: window }
_を渡せば、式にアクセスできます。グローバルwindow
オブジェクトに追加し、想像もしなかったあらゆる悪事を行うことができます。
また、リストになかった機能もいくつかあります。
listOfPeople[.name == "John"]
_は、listOfPeople
プロパティが_"John"
_である人々のみを含むname
のサブ配列を返します。"A;B;C"|lower|split(";") // => ["a", "b", "c"]
。これはまさにあなたが探しているもののようです。