Avaliação do Python: ainda é perigoso se eu desabilitar os recursos internos e atribuir o acesso?
Nós todos sabemos issoeval
é perigoso, mesmo se você ocultar funções perigosas, porque você pode usar os recursos de introspecção do Python para cavar as coisas e extraí-las novamente. Por exemplo, mesmo se você excluir__builtins__
, você pode recuperá-los com
[c for c in ().__class__.__base__.__subclasses__()
if c.__name__ == 'catch_warnings'][0]()._module.__builtins__
No entanto, todos os exemplos que eu vi disso usam acesso a atributos. E se eu desativar todos os builtins,e desativar o acesso ao atributo (tokenizando a entrada com um tokenizer Python e rejeitando-o se ele tiver um token de acesso ao atributo)?
E antes que você pergunte, não, para o meu caso de uso, não preciso de nenhum deles, portanto não é muito prejudicial.
O que estou tentando fazer é tornar o SymPy'ssimpatizar funcionar mais seguro. Atualmente, ele simboliza a entrada, faz algumas transformações e a avalia em um espaço para nome. Mas é inseguro porque permite o acesso a atributos (mesmo que não seja necessário).