Fondamentalement, la seule façon de faire est de l'analyser vous-même. Vous naviguez dans l'arbre d'analyse pour garantir que chaque partie est dans une liste blanche d'opérations parfaitement bénignes et sécurisées, rendant l'expression entière sûre par construction. La réponse de Ned Batchelder est en fait une (simple) forme de ceci. Vous pourriez passer à eval()
après cela, bien que, quel serait le point? Vous pouvez calculer la valeur de chaque sous-expression dans le cadre de la vérification (c'est particulièrement une bonne idée car cela rend votre parser résistant aux changements de syntaxe Python et ainsi de suite). Cette liste blanche doit être extrêmement petite, et il y a beaucoup de choses que vous pourriez penser correctes, mais qui ne le sont pas (par exemple, l'opérateur d'appel général, la fonction getattr). Tu dois être très prudent.
Une liste noire est absolument hors de question (comme la suggestion de "rejeter les entrées suspectes"). Rejeter tout ce qui n'est pas forcément bon. Si vous ne le faites pas, il sera trivial de contourner votre filtre et de donner une expression qui fait quelque chose de mal, sauf la possibilité improbable que votre code soit meilleur que tout autre filtre blacklisté pour Python jamais créé.
Il y a eu des tentatives pour restreindre l'exécution de Python, l'un est le module infâme et maintenant désactivé (parce qu'il n'a pas fonctionné) rexec (et compagnie), et l'autre est PyPy's sandbox. Cette deuxième option ne fait pas exactement ce que vous avez demandé, mais elle mérite certainement d'être étudiée. C'est probablement ce que j'utiliserais - cela signifie simplement que ce ne sera pas aussi facile que eval(safematize(user_input))
.
L'analyser de la même manière qu'un interpréteur Python le ferait? –