Hernan Foffani escribió:
El 07/05/2010, a las 21:27, Oswaldo Hernández escribió:

Reynaldo Baquerizo escribió:
   En definitiva, ¿Qué es lo que quieres evitar? Hay cosas muy dañinas
   que un usuario tontorrón puede hacer y que son muy difíciles de
   detener ("while 1: pass")
algunas ideas puedes sacar de esta receta
http://code.activestate.com/recipes/496746-restricted-safe-eval/
La he estado viendo y creo que puedo sacar cosas muy interesantes, el exec lo 
realiza en un thread para controlar el timeout, y me llama la atencion 
especialmente el uso que hace de los módulos 'inspect' y 'compiler' para 
analizar el codigo a ejecutar.

Python no deja de sorprenderme :)

Lee los comentarios; verás que hay varias situaciones que no están contempladas.
Mientras el entorno restringido no sea oficial, es decir, que está bien 
integrado al intérprete y bendecido por GvR y amigos tendrás unos cuantos 
agujeros y lo que es peor, una falsa sensación de seguridad.

Dicho de otro modo, conmigo o van todos desarmados o portando armas de fuego. 
En este último caso, yo me quedo a kilómetros de distancia. El arco y flecha da 
muchos dolores de cabeza: pierdes un montón de tiempo enseñando a los usuarios 
a usarlo, se quejan de que no les sirve para cazar rinocerontes y hagas lo 
hagas terminas recibiendo una flecha en el culo.



Hola,

Despues de trabajar un poco en esto, he sacado las siguientes conclusiones:

- El problema de los bucles infinitos se soluciona con la ejecución en un thread con un timeout. En las pruebas realizadas ha funcionado.

- Los problemas de las operaciones matemáticas complejas, como indican en los comentarios, y un crash por consumo excesivo de memoria, tienen mala solución. Pueden colgar, o aparentar que se cuelga la aplicación. Con este tendré que convivir y generar logs para detectar el problema a posteriori.

- Sobre el entorno seguro, la verdad es que de seguro no tiene mucho, puedes modificar atributos de clase, etc. Pero por lo que he estado investigando y probando todo se hace accediendo a las propiedades __class__, __file__, etc. de los objetos que se le pasan al entorno. Segun esto se puede analizar fácilmente el código antes de ejecutar e impedir la ejecución si contiene '__'.


En cuanto a los minilenguajes fué mi primera intención, pero no encontré, o no supe buscar, nada que me satisfaciera.

Aunque siempre hablo de "usuario" realmente son personas confiables, es una aplicación de escritorio por lo que tampoco hay un acceso generalizado, pero siempre puede aparecer in listillo.

Creo que con lo mencionado obtengo un entorno fácil de implementar y razonablemente seguro.

Saludos,

--
Oswaldo Hernández
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a