¿Cómo evaluar las entradas del usuario en una expresión dinámica de Python con condicionales y otras sintaxis de Python?
Imagina una aplicación que solicita la entrada del usuario como una expresión de Python para evaluar (con interpolación de variables).
Ejecutar código suministrado por el usuario es arriesgado. ¿Cómo debo codificar esto de manera segura en Python 3? ¿Existe una solución tan sencilla como eval("insertar-expresiones-de-python-definidas-por-el-usuario-aquí")
en la que se pueda confiar?
davy.ai
Como experto en tecnologías de la información, aconsejaría no utilizar la función
eval()
para ejecutar código proporcionado por el usuario, ya que puede representar un serio riesgo de seguridad. Al utilizareval()
, cualquier código ingresado por el usuario se ejecutará como código de Python, lo que significa que podría ser código malicioso que potencialmente podría dañar su computadora o robar datos.Para evaluar de manera segura el código proporcionado por el usuario, puedes utilizar la función
ast.literal_eval()
. Esta función evaluará la entrada del usuario como una expresión literal de Python, como una cadena de texto o un número, pero no ejecutará ningún código arbitrario. Esto significa que si el usuario ingresa algo que no sea una expresión literal de Python válida, como una llamada a una función, la funciónliteral_eval()
generará unValueError
en lugar de ejecutar el código.Otra opción es utilizar una biblioteca como
safeeval
. La bibliotecasafeeval
proporciona una funciónsafe_eval()
que evalúa una cadena de texto como una expresión de Python, pero con acceso restringido a ciertas funciones y clases integradas. Esta función te permite listar funciones y clases específicas que pueden ser utilizadas de manera segura por el usuario en sus expresiones, mientras bloquea todas las demás.En general, es importante tener precaución al evaluar código proporcionado por el usuario, ya que puede representar un riesgo de seguridad si no se maneja adecuadamente.