@GingerPlusPlus: Спасибо, похоже, Марк переместил свой домен. Я обновил ссылки.
я оцениваю строку Python с помощью eval (), и у меня есть такой класс:
class Foo(object):
a = 3
def bar(self, x): return x + a
Каковы риски безопасности, если я не доверяю строке? В частности:
Являетсяeval(string, {"f": Foo()}, {})
небезопасным? То есть вы можете связаться с os, sys или чем-то небезопасным из экземпляра Foo?Являетсяeval(string, {}, {})
небезопасным? То есть можно ли полностью достучаться до os или sys из встроенных функций, таких как len и list?Есть ли способ, чтобы встроенные функции вообще не присутствовали в контексте eval?Есть некоторые небезопасные строки, такие как «[0] * 100000000», которые меня не волнуют, потому что в худшем случае они замедляют / останавливают программу. В первую очередь меня беспокоит защита пользовательских данных, внешних по отношению к программе.
Очевидно, чтоeval(string)
без пользовательских словарей небезопасно в большинстве случаев.