Re: [Python-es] exec seguro

2010-05-08 Por tema Narcis Garcia - GiLUG
Quizás pueda establecer un diccionario de funciones y operadores 
admisibles, y antes de ejecutar la expresión analizar si todas las 
palabras de la cadena estan en el diccionario.




En/na Hernan Foffani ha escrit:

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.

En mi opinión, hay dos alternativas viables. Si tienes usuarios en los que no 
puedes confiar ni pedir responsabilidades (por ejemplo, un sitio web) es mejor 
pasar del scripting de aplicaciones. Si puedes confiar en ellos (sabes quiénes 
son, el grupo es acotado, etc.) dales todo el poder y que tengan bien claro que 
lo tienen. Excluyo la opción de incorporar un evaluador de expresiones o un 
minilenguaje o un DSL porque, aunque es una solución perfectamente válida, no 
es lo que preguntabas.

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.


___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] exec seguro

2010-05-07 Por tema Hernan M Foffani
2010/5/7 Oswaldo Hernández lis...@soft-com.es:
 Hola *.*,

 Aprovecho que hay thread sobre eval para comentar también mis dudas.

 Estoy trabajando en un sistema que me permita ejecutar de forma segura un
 código python que ha creado el usuario de la aplicación.

 La idea es hacer un proceso intermedio entre la lectura de datos desde un
 archivo o base de datos, y el procesado de los mismos.

 Mediante este proceso el usuario podría definir un código que evaluara los
 datos leídos y los manipulara antes de su procesado definitivo.

 Este código solo debería tener acceso a las funcionas matemáticas y de
 string básicas para manipular los objetos que ha definido previamente la
 aplicación.

 Para crear el entorno seguro estoy utilizando una receta que un listero
 envió hace bastante tiempo, sorry no recuerdo quien :(

    env={__builtins__:__builtins__}
    exec from cmath import * in env
    env[__builtins__]={}

    # agregar diccionario con datos a evaluar/manipular
    env[datos]=dic

    # ejecutar
    exec codigo in env

 En las pruebas realizadas funciona bien, pero me quedan las siguientes
 dudas:

 1. Los datos que se permite manipular serán diccionarios y clases sencillas.
 Soy consciente que si algún método de las clases que incluya en el entorno
 hace 'cosas raras', podrá ejecutarlo, eso ya es responsabilidad mia.

 Pero, ¿Es suficiente seguro esto?

Todo depende de qué entiendes por seguridad.

Si lo que buscas es un sandbox (¿se usa arenero?) ya te puedes ir
olvidando. Y menos que menos si pretendes que esté certificado. De
hecho el restricted-python hace tiempo que se marcó como obsoleto por
la cantidad de agujeros que tenía.

Creo que hay algunos colaboradores que hay vuelto sobre el asunto y
están rehaciendo el entorno desde cero. Si mal no recuerdo la idea era
basarlo todo en capabilities. Pero no tengo idea en qué estado está
ahora.

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)
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] exec seguro

2010-05-07 Por tema Reynaldo Baquerizo
 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/
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] exec seguro

2010-05-07 Por tema Oswaldo Hernández

Hernan M Foffani escribió:

2010/5/7 Oswaldo Hernández lis...@soft-com.es:


Pero, ¿Es suficiente seguro esto?


Todo depende de qué entiendes por seguridad.

Si lo que buscas es un sandbox (¿se usa arenero?) ya te puedes ir
olvidando. Y menos que menos si pretendes que esté certificado. De
hecho el restricted-python hace tiempo que se marcó como obsoleto por
la cantidad de agujeros que tenía.



Lo que me pretendo es ser consciente del grado de seguridad que 
proporciona. No creer que es seguro 100% cuando en realidad no lo es.


Si la seguridad de que no puedan acceder a objetos 'no autorizados' es 
muy baja, pues elimino esto del proyecto y ya buscaré otra solución.


Si el factor de seguridad es razonablemente alto, pues entonces me 
gustaría conocer los 'agujeros' para estar preparado cuando surjan los 
problemas.




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)


Ya ves, en esto no habia caido ;)

Supongo que este tipo de cosas se solucionarían realizando el exec en un 
thread distinto y controlando el tiempo que tarda en ejecutarse.


Gracias.

--
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/


Re: [Python-es] exec seguro

2010-05-07 Por tema Hernan Foffani

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.

En mi opinión, hay dos alternativas viables. Si tienes usuarios en los que no 
puedes confiar ni pedir responsabilidades (por ejemplo, un sitio web) es mejor 
pasar del scripting de aplicaciones. Si puedes confiar en ellos (sabes quiénes 
son, el grupo es acotado, etc.) dales todo el poder y que tengan bien claro que 
lo tienen. Excluyo la opción de incorporar un evaluador de expresiones o un 
minilenguaje o un DSL porque, aunque es una solución perfectamente válida, no 
es lo que preguntabas.

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.


___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/