2009-04-08 10 views
5

Estoy desarrollando un sistema que permite a los desarrolladores cargar scripts groovy personalizados y plantillas freemarker.Código Sandboxing Java/Groovy/Freemarker - Prevención de la ejecución de métodos específicos

Puedo proporcionar un cierto nivel de seguridad a un nivel muy alto con la infraestructura de seguridad Java predeterminada, es decir, evitar que el código acceda al sistema de archivos o a la red, pero necesito restringir el acceso a métodos específicos.

Mi plan era modificar los tiempos de ejecución de Groovy y Freemarker para leer Anotaciones que incluirían en la lista blanca o en la lista negra ciertos métodos, sin embargo esto me obligaría a mantener una versión bifurcada de su código, lo cual no es deseable.

Todo lo que esencialmente necesito poder hacer es evitar la ejecución de métodos específicos cuando se me llama desde Groovy o Freemarker. He considerado un truco que vería la pila de llamadas, pero este sería un golpe de velocidad enorme (y bastante desordenado).

¿Alguien tiene alguna otra idea para implementar esto?

Respuesta

5

Puede hacerlo subclasificando el GroovyClassLoader y aplicando sus restricciones dentro de un visitante de AST. Esta publicación explica cómo hacerlo: http://hamletdarcy.blogspot.com/2009/01/groovy-compile-time-meta-magic.html

Además, el código al que se hace referencia allí está en la carpeta de ejemplos del instalador de Groovy 1.6.

+1

En muchos (la mayoría) de los casos, la clase en la que se encuentra el método no se conocerá en tiempo de compilación, por lo que analazying the AST no funcionará realmente. Aún así, esta es la mejor respuesta aquí, así que marcaré esta. Terminé encontrando una solución decente usando Metaclasses. –

2

OSGi es ideal para esto. Puede dividir su código en paquetes y establecer exactamente qué expone cada paquete, y qué otros paquetes. ¿Eso funcionaría para ti?

+0

¿Este me permite restringir código de llamar a los métodos específicos? –

+0

El concepto es algo así como empaquetar. A continuación, puede restringir los métodos y cosas fuera de ese paquete. –

+0

Estrictamente hablando, no puede restringir que se llamen ciertos métodos de una clase, pero podría crear una clase base y una clase secundaria con más métodos, y solo dar acceso a la clase base más restrictiva. –

3

Debería echar un vistazo al proyecto groovy-sandbox de kohsuke. También eche un vistazo a su blog post here sobre este tema y lo que está solucionando la solución es el espacio aislado, pero el inconveniente de rendimiento.

Cuestiones relacionadas