7

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) 唯一の解決策が独自の式エバリュエーターを作成することである場合、一貫したセキュリティ モデルを作成する方法に関するガイダンスはどこにありますか? 私はこれに不慣れで、コードインジェクションに使用される一般的なトリックが何であるかわかりません。だからこそ、これを自分で書く必要は避けたかったのです。

4

1 に答える 1

1

ユーザーが JavaScript を記述できるようにするには、Rhino を埋め込むことをお勧めします。(2)javascriptを実行できる(またはjavascriptからjavaを実行できる)Javaライブラリであるという基準に完全に適合します。

コンテキストを設定すると、ユーザーは、コンテキストに配置したもの、またはコンテキストからアクセスできるようにしたものにのみアクセスできます。JavaScript 式は、上に示した最も単純なケースのように単純にすることも、必要に応じて複雑にすることもできます。Rhino を組み込み、限られたオブジェクト セットを公開することは、過去のプロジェクトであらゆる種類のユーザー スクリプトを有効にする優れた方法でした。それは数年前のことでしたが、Rhino は現在かなり成熟しています。

また、問題で必要な場合は、同じ式がクライアント側またはサーバー側で問題なく実行されるように設定できるという利点もあります。

Rhino を埋め込んで必要なことを達成するための詳細については、http://www.mozilla.org/rino/tutorial.html#runScriptを参照してください。

于 2012-08-01T06:05:21.673 に答える