Python: hace que eval sea segura

Quiero una forma fácil de hacer una “calculadora API” en Python.

En este momento no me importa mucho el conjunto exacto de características que la calculadora va a admitir.

Quiero que reciba una cadena, diga "1+1" y devuelva una cadena con el resultado, en nuestro caso "2" .

¿Hay una manera de hacer que la eval segura para tal cosa?

Para empezar lo haría

 env = {} env["locals"] = None env["globals"] = None env["__name__"] = None env["__file__"] = None env["__builtins__"] = None eval(users_str, env) 

para que la persona que llama no pueda meterse con mis variables locales (o verlas).

Pero estoy seguro de que estoy supervisando mucho aquí.

¿Se pueden eval los problemas de seguridad de eval o hay demasiados pequeños detalles para que funcione correctamente?

¿Se pueden arreglar los problemas de seguridad de eval o hay demasiados pequeños detalles para que funcione correctamente?

Definitivamente el último: un hacker inteligente siempre logrará encontrar una manera de evitar tus precauciones.

Si está satisfecho con las expresiones simples que usan solo literales de tipo elemental, use ast.literal_eval – ¡para eso es! Para cualquier cosa más sofisticada, recomiendo un paquete de análisis, como la capa si está familiarizado y cómodo con el enfoque clásico de lexx / yacc, o realizar un seguimiento de pips para un enfoque posiblemente más pythonico.

Es posible obtener acceso a cualquier clase que haya sido definida en el proceso, y luego puede crear una instancia e invocar métodos en ella. Es posible segregar al intérprete de CPython, o hacer que se cierre. Mira esto: Eval realmente es peligroso

Los problemas de seguridad no son (ni siquiera cerca de) solucionables.

pyparsing para analizar la expresión en una lista de tokens (esto no debería ser demasiado difícil, porque la gramática es sencilla) y luego manejar los tokens de forma individual.

También puede usar el módulo ast para crear un AST de Python (ya que está usando una syntax de Python válida), pero esto puede estar abierto a agujeros de seguridad sutiles.

Perl tiene un módulo de evaluación segura http://perldoc.perl.org/Safe.html

En Google “Python Equivalente de Perl Safe” encuentra http://docs.python.org/2/library/rexec.html

pero este “ejecutable restringido” de Python está en desuso.

En general, la seguridad “eval”, en cualquier idioma, es un gran problema. Los ataques de inyección SQL son solo un ejemplo de este agujero de seguridad. Perl Safe ha tenido errores de seguridad a lo largo de los años; la más reciente, recuerdo, era segura, excepto por los destructores en los objetos devueltos desde la evaluación de seguridad.

Es el tipo de cosa que podría usar para mis propias herramientas, pero no para la web.

Sin embargo, espero que algún día las pruebas completamente seguras estén disponibles en muchos / cualquier idioma.