Estoy trabajando en una aplicación web basada en django que toma el archivo python como entrada que contiene alguna función, luego en el backend tengo algunas listas que se pasan como parámetros a través de la función del usuario, lo que generará una salida de valor único. El resultado generado será utilizado para algunos cálculos adicionales.
Así es como se ve la función dentro del archivo del usuario:
def somefunctionname(list): ''' some computation performed on list''' return float valueActualmente, el enfoque que estoy usando es tomar el archivo del usuario como entrada de archivo normal. Luego, en mi views.py estoy ejecutando el archivo como módulo y pasando los parámetros con la función eval. Fragmento se da a continuación.
Aquí modulename es el nombre del archivo python que tomé del usuario e importé como módulo
exec("import "+modulename) result = eval(f"{modulename}.{somefunctionname}(arguments)")Que está funcionando absolutamente bien. Pero sé que este no es el enfoque seguro.
Mi pregunta, ¿hay alguna otra forma de ejecutar el archivo de los usuarios de forma segura ya que el método que estoy usando no es seguro? Sé que las soluciones propuestas no pueden ser una prueba completa, pero ¿cuáles son las otras formas en que puedo ejecutar esto (por ejemplo, si se puede resolver con dockerización, entonces cuál será el enfoque o algunas herramientas externas que puedo usar con API)? O, si es posible, ¿alguien puede decirme cómo puedo simplemente aislar esto o cualquier tutorial que pueda ayudarme?
Cualquier referencia o recurso será útil.
Seguro que con la ventana acoplable puede aislar la ejecución si tiene cuidado. Puede restringir los ciclos de CPU, maximizar la memoria, cerrar todos los puertos de red, ejecutar como usuario con acceso de solo lectura al sistema de archivos y todo).
Aún así, esto sería extremadamente complejo para hacerlo bien, creo. Para mí, no permitirá que un cliente ejecute un código arbitrar como ese.
Sería verificar si una producción/solución aún no está hecha y usar eso. Estaba pensando que algunos sitios te permiten enviar algún código (python, java, lo que sea) que se ejecuta en el servidor.