¿Qué tan segura es la evaluación de expresiones usando eval?
Estoy creando un sitio web en el que tengo la necesidad de que el usuario pueda evaluar algunas expresiones basadas en el valor de las tablas de DB, en lugar de usar herramientas como pyparsing, etc., estoy pensando en usar Python en sí y he encontrado una solución. lo cual es suficiente para mi propósito. Básicamente estoy usando eval para evaluar la expresión y pasar globals con vacío__builtins__
por lo que no se puede acceder a nada y los locales dictan los valores de DB, si el usuario necesita algunas funciones, también puedo pasarlas, por ejemplo.
import datetime
def today():
return datetime.datetime.now()
expression = """ first_name.lower() == "anurag" and today().year == 2010 """
print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
Así que mi pregunta es qué tan seguro sería, tengo tres criterios
¿El usuario puede acceder al estado actual de mi programa o tabla, etc.?¿El usuario puede tener acceso a llamadas de nivel OS?El usuario puede detener mi sistema haciendo un bucle o usando mucha memoria, por ejemplo Al hacer rango (10 * 8), en algunos casos puede, por ejemplo, 100 ** 1000, etc., por lo que 3 no es tanto un problema. Puedo verificar tal operación con tokenize y de todas formas estaré usando GAE, así que no es una gran preocupación.Editar: OMI este no es el duplicado deQ: 661084 Porque donde termina éste, quiero saber incluso con__builtins__
Bloqueado, ¿el usuario puede hacer cosas malas?