2009-06-27 11 views
2

私は、ユーザが小さな「スクリプト」をサーバに提出するプロジェクトを進めており、それらのスクリプトを実行します。 Javaプログラムには、mvel、ognl、uel、clojure、rhino javascriptなどのような多くのスクリプト言語が組み込まれていますが、私が知る限り、スクリプト作成者はJavaのコンストラクタをstaticメソッドなどがあります。「安全でない」JavaメソッドにアクセスできないJava表現言語

私はユーザが(通常は何らかのコンテキストオブジェクトを介して)私がそれらを提供しないものを呼び出せないようにします。スクリプトのほとんどは算術式と論理式ですが、オブジェクトのプロパティ(ゲッター/セッター)やマップの内容をトラバースする必要があります。私はそれらを提供するサンドボックスから彼らを逃れることを望んでいません。

提案がありますか?

+0

JavaのJSP言語(UEL)はそれを行うことができますように見えます。 Javaの静的メソッドにアクセスするには、XMLファイルで別名を付ける必要があります。静的でないメソッドにはアクセスできないと思います。私はglassfishのUELをまだ働かせることができないので、これを確認することはできません。 – Shahbaz

答えて

1

機能するサンドボックスを構築するのは難しいです。あなたができることは、親から選択された少数の型への参照のみを可能にするカスタムクラスローダーを使用することです。

2

ジャスト:

//Remember old one 
    ClassLoader orginalClassLoader = Thread.currentThread().getContextClassLoader(); 
    //Set my classloader 
    ClassLoader myClassLoader = new SecureMVELClassLoader(); 
    Thread.currentThread().setContextClassLoader(myClassLoader); 

    System.out.println(MVEL.eval("new com.myapp.insecure.InsecureClass()")); 
    //Set back to original classloader 
    Thread.currentThread().setContextClassLoader(orginalClassLoader); 

と私のクラスローダに

public class SecureMVELClassLoader extends ClassLoader { 


@Override 
public Class<?> loadClass(String name) throws ClassNotFoundException { 
     //some filter logic here 
    if (name.startsWith("com.myapp.insecure.")) throw new ClassNotFoundException(); 
    return super.loadClass(name); 
} 
関連する問題