world tutorial hello google engine docs app java security google-app-engine policy classloader

tutorial - ¿Puedo denegar el acceso a una clase jvm configurando el archivo java.policy?



google sdk app engine (3)

La documentación de Java enumera todos los posibles permisos de política aquí: http://java.sun.com/javase/6/docs/technotes/guides/security/permissions.html

No se menciona la creación / carga de clase, por lo que creo que no se puede aplicar esto usando una política.

En cualquier caso, ¿por qué quieres lanzar una excepción cuando se carga una clase de excepción? Tal vez podrías explicar tu problema, entonces alguien podría proponer una solución.

Editar:

Una forma de evitar la carga de ciertas clases sería eliminarlas de la instalación de JRE. La mayoría de las clases del sistema están contenidas en rt.jar en su instalación JDK / JRE. Debería poder modificarlo con cualquier herramienta ZIP.

Simplemente crea una instalación especial de tu JRE y modifica su rt.jar. Es un truco feo, pero debería estar bien para fines de prueba ...

Quería agregar a mi jdk6/jre/lib/security/java.policy una interdicción para crear algunas clases que están en la lista negra de appengine. Por ejemplo, quiero que mi jvm local arroje una excepción cuando la aplicación intenta instanciar javax.naming.NamingException .

¿Es posible?

Trataré de explicar mi problema específico aquí. Google ofrece un servicio (motor de la aplicación GAE-google) que tiene algunas limitaciones sobre qué clases se pueden usar. Por ejemplo, no crea instancias de clases JNDI que están en el paquete javax.naming. También ofrecen un servidor de prueba que se puede usar para probar esta aplicación en mi máquina, pero este servidor permite dichas clases y puede agilizar el código. Descubres que usaste una clase en la lista negra solo después de subir tu aplicación a google. Estaba pensando si dicha aplicación de la lista negra de clase no podría hacerse en el jvm de desarrollo. De lo contrario, estoy pensando que esto sería fácil ya que podrían proporcionar ese archivo de política.


Puede escribir una pequeña aplicación de cargador que cree un nuevo cargador de clases personalizado . Sus clases de aplicación podrían cargarse utilizando este cargador de clases.

En el cargador de clases personalizado, puede lanzar ClassNotFoundException cuando su aplicación intente acceder a la clase que desea incluir en la lista negra.

Deberá sobrecargar el método load (). Este método será responsable de arrojar la excepción en sus clases incluidas en la lista negra o de delegar en el Classloader principal si la clase está permitida. Una implementación de ejemplo:

public Class loadClass(String name) throws ClassNotFoundException { if(name.equals("javax.lang.ClassIDontLike")){ throw new ClassNotFoundException("I''m sorry, Dave. I''m afraid I can''t do that."); } return super.loadClass(name, false); }

(Por supuesto, una implementación real puede ser mucho más sofisticada que esta)

Debido a que las clases de su aplicación se cargan a través de este cargador de clases, y usted solo está delegando las invocaciones de loadClass () al cargador de clases padre cuando lo desee, puede poner en lista negra las clases que necesite.

Estoy bastante seguro de que este es el método que utiliza Google para poner en una lista negra las clases en su servidor. Cargan todas las aplicaciones en un Classloader específico. Esto también es similar a la forma en que Tomcat aísla las diferentes aplicaciones web.


¿No preferiría obtener errores de compilación más que de tiempo de ejecución mientras prueba su programa? Puede configurar su IDE o compilador para advertirle cuando se crea una instancia de una clase no deseada. Sé que AspectJ tiene algunas buenas características para esto: puedes definir advertencias / errores de compilación en los puntos de unión y obtener retroalimentación en, por ejemplo, Eclipse. Para usar esto en Eclipse, simplemente instale el complemento AspectJ y escriba un aspecto adecuado. Para obtener los errores al compilar desde una línea de comando o script, en realidad tendría que usar el compilador de AspectJ, pero dudo que lo necesite.