Estoy generando imágenes dinámicas en un servicio web. La configuración actual es:
- solicitud
image.py
-
image.py
realiza una búsqueda en la base de datos para determinar qué datos usar para generar la imagen -
image.py
llama a un sub-script (dado por la base de datos; por ejemplo,cats.py
) para generar la imagen en particular
Así que image.py
contiene código de envoltorio estándar, y cats.py
dibuja gatos ( dogs.py
naturalmente dibujaría perros). Me gustaría generalizar esta configuración para que los usuarios puedan proporcionar su propio código de trazado, sujeto a mis variables proporcionadas previamente, principalmente el lienzo de trazado y la biblioteca math
.
Por supuesto, permitir que se carguen scripts genéricos de Python es un problema de seguridad sustancial. Me gustaría mantener mi servidor bajo mi control y evitar que se use para disparar el spam a través de Internet; administrar el servidor con bucles y grandes estructuras de datos también es una preocupación, pero sé que no hay mucho que hacer al respecto (¡por favor, demuéstreme que estoy equivocado!).
¿Serán suficientes las siguientes medidas para protegerse contra las formas más flagrantes de abuso?
- Llame a
image.py
como usuario con permisos limitados (para evitar que los usuarios obtengan información crítica del servidor) - Deshabilite funciones clave como
__import__
,eval
,exec
, etc., al establecerlas comoNone
, para limitar las capacidades a un entorno controlado (para evitar que los usuarios importen bibliotecas de red y otras cosas con potencial desagradable)
Estoy destruyendo el objeto de la base de datos y todas las variables críticas antes de llamar a los scripts de usuarios potenciales. Un desafío es que estoy devolviendo errores de Python cuando existen, modificando el tipo de contenido del documento devuelto. Esto podría permitir la inspección de ciertas propiedades, pero también es necesario para permitir la depuración.
He encontrado estas preguntas relacionadas, pero no estoy seguro de que estén directamente relacionadas:
Actualización: veo por las pruebas que __import__ = None
no desactiva la palabra clave import
. Así que quizás este concepto no funcione.