tutorial snake lenguaje learn for dummies descargar python scripting

snake - ¿Cómo puedo sandbox Python en Python puro?



python snake (8)

AFAIK es posible ejecutar un código en un entorno completamente aislado:

exec somePythonCode in {''__builtins__'': {}}, {}

Pero en ese entorno no se puede hacer casi nada :) (ni siquiera se puede import un módulo, pero aún así un usuario malintencionado puede ejecutar una recursión infinita o que se le acabe la memoria). Probablemente desee agregar algunos módulos que serán interfaz para tu motor de juego.

Estoy desarrollando un juego web en Python puro y quiero tener disponibles scripts simples para permitir un contenido más dinámico del juego. El contenido del juego puede ser agregado en vivo por usuarios con privilegios.

Sería bueno si el lenguaje de scripting pudiera ser Python. Sin embargo, no se puede ejecutar con el acceso al entorno en el que se ejecuta el juego, ya que un usuario malintencionado podría causar estragos, lo que sería malo. ¿Es posible ejecutar Sandbox Python en Python puro?

Actualización : de hecho, dado que el soporte verdadero de Python sería excesivo, un lenguaje de scripting simple con sintaxis Pythonic sería perfecto.

Si no hay ningún intérprete de guión de Pythonic, ¿hay algún otro intérprete de guión de código abierto escrito en Python puro que pueda usar? Los requisitos son soporte para variables, condicionales básicos y llamadas a funciones (no definiciones).


Creo que tu mejor apuesta será una combinación de las respuestas hasta ahora.

Querrá analizar y desinfectar la entrada, eliminando cualquier instrucción de importación, por ejemplo.

Luego puede usar la muestra de exec de Messa (o algo similar) para permitir la ejecución del código solo contra las variables integradas de su elección, muy probablemente algún tipo de API definida por usted que le proporcione al programador acceso a la funcionalidad que considere relevante.


Encontrarás algunas ideas en esta página wiki , pero no parece que se pueda hacer fácilmente.


Esto es realmente no trivial.

Hay dos formas de sandbox Python. Una es crear un entorno restringido (es decir, muy pocos globales, etc.) y exec su código dentro de este entorno. Esto es lo que Messa está sugiriendo. Es bueno, pero hay muchas maneras de salir del arenero y crear problemas. Hubo un hilo acerca de esto en Python-dev hace un año o algo así, en el que las personas hacían cosas al atrapar excepciones y hurgar en el estado interno para pasar a la manipulación del código byte. Este es el camino a seguir si quieres un lenguaje completo.

La otra forma es analizar el código y luego usar el módulo ast para eliminar construcciones que no desea (por ejemplo, declaraciones de importación, llamadas a funciones, etc.) y luego compilar el resto. Este es el camino a seguir si quiere usar Python como un lenguaje de configuración, etc.

Otra forma (que podría no funcionar para ti ya que estás usando GAE), es el sandbox PyPy . Si bien no lo he usado yo mismo, la palabra en los intertubos es que es el único verdadero pitón con espacio aislado que hay.

Según su descripción de los requisitos (los requisitos son compatibles con variables, condicionales básicos y llamadas a función (no definiciones)), es posible que desee evaluar el enfoque 2 y expulsar todo lo demás del código. Es un poco complicado pero factible.


Hmm. Este es un experimento mental, no sé si se hizo:

Puede usar el paquete del compiler para parse el script. A continuación, puede recorrer este árbol, anteponiendo todos los identificadores - variables, nombres de método, etc. (también has|get|setattr invocaciones de has|get|setattr etc.) - con un preámbulo único para que no puedan referirse a sus variables. También podría asegurarse de que no se haya invocado el paquete del compiler , y quizás otras cosas incluidas en la lista negra, como abrir archivos. Luego, emite el código python para esto y compiler.compile lo compiler.compile .

Los documentos señalan que el paquete del compiler no está en Python 3.0, pero no menciona cuál es la alternativa 3.0.

En general, esto es paralelo a cómo el software del foro y tal intentan incluir en la lista blanca el Javascript o HTML "seguro", etc. Y históricamente tienen un mal historial de pisotear todos los escapes. Pero es posible que tengas más suerte con Python :)


Me gustaría ver un enfoque de dos servidores. El primer servidor es el servidor web privilegiado donde vive su código. El segundo servidor es un servidor muy controlado que solo proporciona un servicio web o un servicio RPC y ejecuta el código que no es de confianza. Usted proporciona a su creador de contenido su interfaz personalizada. Por ejemplo, si permitía que el usuario final creara elementos, tendría una búsqueda que llamara al servidor con el código para ejecutar y el conjunto de parámetros.

Aquí hay un ejemplo abstracto de una poción de curación.

{function_id=''healing potion'', action=''use'', target=''self'', inventory_id=''1234''}

La respuesta puede ser algo así como

{hp=''+5'' action={destroy_inventory_item, inventory_id=''1234''}}


No estoy seguro de por qué nadie menciona esto, pero Zope 2 tiene una cosa llamada Python Script, que es exactamente eso: Python restringido ejecutado en un entorno limitado, sin acceso al sistema de archivos, con acceso a otros objetos Zope controlados por maquinaria de seguridad Zope. con importaciones limitadas a un subconjunto seguro.

Zope en general es bastante seguro, así que me imagino que no hay formas conocidas o obvias de salir del arenero.

No estoy seguro de cómo se implementan las secuencias de comandos de Python, pero la función ya existía desde el año 2000.

Y aquí está la magia detrás de PythonScripts, con documentación detallada: http://pypi.python.org/pypi/RestrictedPython - incluso parece que no tiene ninguna dependencia en Zope, por lo que se puede usar de forma independiente.

Tenga en cuenta que esto no es para ejecutar de forma segura código python arbitrario (la mayoría de los scripts aleatorios fallarán en la primera importación o acceso a archivos), sino más bien para usar Python para scripts limitados dentro de una aplicación Python.

Esta respuesta es de mi comentario a una pregunta cerrada como un duplicado de esta: Python de Python: ¿restricción de la funcionalidad?