[Python-es] exec seguro
Oswaldo Hernández
listas en soft-com.es
Lun Mayo 10 19:20:56 CEST 2010
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
Más información sobre la lista de distribución Python-es