JSON ファイルから読み取る、信頼されていないユーザーからの式をアプリで評価したいと考えています。そのような:
value = "(getTime() == 60) AND isFoo('bar')"
StackOverflow で、これに関する多くのスレッドを見つけました。通常は、JavaScript を読み取ることができる Java 独自の ScriptEngine クラスを使用することをお勧めします。または、JEXL、MVEL、または次のリストにあるその他の既存のライブラリを使用することをユーザーに推奨します: http://java-source.net/open-source/expression-languages
しかし、それらはすべて信頼できるユーザーに依存しているようです (例: 自分で作成し、その中でスクリプトを実行したい構成ファイル)。しかし、私の場合、式の評価を安全なサンドボックスで実行したいと考えています。したがって、ユーザーは次のような単純なことはできません。
value = "while(true)" // or
value = "new java.io.File(\"R:/t.txt\").delete()" // this works on MVEL
アプリをロックしたり、不要なリソースにアクセスしたりします。
1) セーフ ボックスで実行できるように簡単に構成できる既存のライブラリはありますか? 「簡単に」とは、独自の式エバリュエーターを作成するよりも高速に使用できる高レベルの構成 API を意味します。私自身の調査を少し行った後、JEXL と MVEL の両方が出ているようです。
2) または、信頼できないユーザーが悪用できないように非常に単純な既存の表現言語はありますか? 私が見つけたものはすべて非常に複雑で、ループや import ステートメントなどを実装しています。必要なのは、数学、論理演算子、および独自に定義した変数とメソッドを解析することだけです。それ以上のものは私の範囲外です。
3) 唯一の解決策が独自の式エバリュエーターを作成することである場合、一貫したセキュリティ モデルを作成する方法に関するガイダンスはどこにありますか? 私はこれに不慣れで、コードインジェクションに使用される一般的なトリックが何であるかわかりません。だからこそ、これを自分で書く必要は避けたかったのです。