Мы все знаем, что eval
является опасным, даже если вы скрываете опасные функции, потому что вы можете использовать функции интроспекции Python, чтобы выкапывать вещи и повторно извлекать их. Например, даже если вы удалите __builtins__
, вы можете получить их с помощью
[c for c in ().__class__.__base__.__subclasses__()
if c.__name__ == 'catch_warnings'][0]()._module.__builtins__
Однако каждый пример, который я видел, использует доступ к атрибутам. Что делать, если я отключу все встроенные функции и отключить доступ к атрибутам (путем токенизации ввода с помощью токенизатора Python и отклонения его, если он имеет токен доступа к атрибуту)?
И прежде чем вы спросите, нет, для моего прецедента, я не нуждаюсь ни в одном из них, так что это не слишком вредно.
Я пытаюсь сделать SymPy sympify более безопасным. В настоящее время он токенизирует ввод, выполняет некоторые преобразования на нем и анализирует его в пространстве имен. Но он небезопасен, потому что он позволяет доступ к атрибуту (даже если он ему действительно не нужен).