Je construis un site web où j'ai besoin que l'utilisateur puisse évaluer une expression basée sur la valeur dans les tables de DB, au lieu d'utiliser des outils comme pyparsing etc, je pense à utiliser python lui-même, et ai trouvé une solution qui est suffisante pour mon but. J'utilise eval pour évaluer l'expression et passer des globaux à vide avec __builtins__
afin que rien ne soit accessible et qu'un local dicte des valeurs de DB, si l'utilisateur aura besoin de certaines fonctions. Je peux les passer par exemple.Quelle est la sécurité de l'évaluation d'expression en utilisant eval?
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})
Alors ma question est de savoir comment il serait en sécurité, j'ai trois critères
- peut accéder à l'utilisateur l'état actuel de mon programme ou d'une table etc someshow?
- L'utilisateur peut-il accéder aux appels de niveau os?
- L'utilisateur peut-il arrêter mon système en faisant une boucle ou en utilisant beaucoup de mémoire, par ex. en faisant la gamme (10 * 8), dans certains cas, il peut par exemple 100 ** 1000 etc, donc 3 n'est pas tellement un problème. Je peux vérifier cette opération avec tokenize et de toute façon je vais utiliser GAE donc ce n'est pas très préoccupant.
Modifier: l'OMI ce n'est pas le double de Q:661084 car où elle se termine celui-ci commence, je veux savoir, même avec __builtins__
bloqué, peut faire de mauvaises choses utilisateur?
Vérifiez: http: // stackoverflow.com/questions/661084/security-of-pythons-eval-on-unstrusted-cordes – fserb
@fserb voir edit –