Estoy haciendo una aplicación wxpython que voy a compilar con la utilidad de congelación para crear un ejecutable para múltiples plataformas.Python - Creando un sistema de "scripting"
el programa será un editer mapa para un motor de juego basado en baldosas
en esta aplicación que quiero para proporcionar un sistema de scripting para que los usuarios avanzados pueden modificar el comportamiento del programa, tales como la modificación de los datos del proyecto, la exportación el proyecto a un formato diferente ect.
Quiero que el sistema funcione así.
el usuario colocará la secuencia de comandos python que desea ejecutar en un cuadro de texto con estilo y luego presiona un botón para ejecutar la secuencia de comandos.
Estoy bien con esto hasta ahora, eso es todo realmente simple. obtener el script desde el cuadro de texto como una cadena de compilar en un objeto de bacalao con la compilación función incorporada() y luego ejecutar el script con un DECLARACIÓN ejecutivo
script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
la cosa es que yo quiero para asegurarse de que esta característica no puede causar ningún error o error
decir si hay una declaración de importación en el script. ¿Esto causará algún problema teniendo en cuenta que el código ha sido compilado con algo como py2exe o py2app?
¿Cómo me aseguro de que el usuario no pueda romper una parte crítica del programa como modificar parte de la GUI mientras le permite modificar los datos del proyecto (los datos se guardan en propiedades globales en su propio módulo)? Creo que esto significaría modificar el dict global que se pasa a la función eval.
cómo me aseguro de que esta evaluación no pueda hacer que el programa se bloquee debido a un bucle largo o infinito? ¿cómo me aseguro de que un error generado dentro del código del usuario no pueda bloquear toda la aplicación?
básicamente, ¿cómo evitar todos los problemas que pueden surgir al permitir que el usuario ejecute su propio código?
EDIT: En cuanto a las respuestas dadas
no me siento como cualquiera de las respuestas hasta ahora realmente han respondido a mis preguntas sí lo han sido en parte respondió pero no completamente. Soy consciente de que es imposible detener por completo el código inseguro. las personas son demasiado inteligentes para que un hombre (o incluso un teem) piense en todas las formas de evitar un sistema de seguridad y prevenirlas.
de hecho, realmente no me importa si lo hacen. Estoy más preocupado porque alguien involuntariamente rompió algo que no sabían. si alguien realmente quisiera, podría destrozar la aplicación con la funcionalidad de scripting, pero no podría importarme menos. será su instancia y todos los problemas que creen desaparecerán cuando reinicien la aplicación a menos que se hayan metido con los archivos en la HD. Quiero evitar los problemas que surgen cuando el usuario toma una dosis estúpida.
cosas como IOError, SystaxErrors, InfiniteLoopErrors ect.
ahora se ha respondido la parte sobre el alcance. Ahora entiendo cómo definir qué funciones y variables globales se puede acceder desde la función eval
, pero ¿hay alguna forma de asegurarse de que la ejecución de su código se puede detener si tarda demasiado?
¿quizás un sistema de hilo verde?(Verde, ya que sería eval para hacer que los usuarios se preocupan por la seguridad de rosca)
también si un usuario utiliza una instrucción import module
para cargar un módulo incluso de la biblioteca por defecto que no se utiliza en el resto de la clase. ¿Podría esto causar problemas con la aplicación congelada por Py2exe, Py2app o Freeze? ¿y si llaman a un lado modal de la biblioteca estándar? ¿Sería suficiente que el modal esté presente en el mismo directorio que el ejecutable congelado?
Me gustaría obtener estas respuestas sin crear una nueva pregunta, pero lo haré si es necesario.
Eval es prácticamente imposible de hacer totalmente seguro (pero esa no es mi principal área de especialización, podría estar hablando de mi trasero). ¿Por qué no ir por el camino de desarrollar una API con una estructura de complemento para esto, si el alcance de seguridad/integración y funcionalidades es una preocupación? –
Oye, al menos no es 'ejecutivo'. – nmichaels
Como mínimo, reconozca que este es uno de esos casos muy, muy raros en los que un getta-catch-em-all 'excepto:' tiene sentido y lo aplica. No es necesario bloquear toda la aplicación porque un usuario relativamente nuevo en python perdió un espacio. +1 y favorito, espero incorporar Python REPL en una aplicación mía también. – delnan