Если я оценка строки Python с помощью Eval(), и есть класс, как:Безопасность eval() на Python на ненадежных строках?
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)
без специальных словарей в большинстве случаев является небезопасным.
Да, если есть импорт sys sys.dostuff в строке, в которой вы делаете eval, и вы не доверяете строкам, материал может стать настоящим уродливым. – Vasil
eval имеет приятное свойство, которое позволяет только выражения. Поэтому такие вещи, как =, импорт и печать, не допускаются. – 2009-03-19 05:06:58
Попробуйте 'eval ('__ import __ (" sys "). Stdout.write (" Hello Joe ")')' –