Безопасный eval() путем явного внесения в белый список встроенных функций и отказа от ошибок? [дубликат]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Безопасный eval() путем явного внесения в белый список встроенных функций и отказа от ошибок? [дубликат]

Сообщение Anonymous »

Я знаю, что нецелесообразно использовать eval() для ненадежных входных данных, но я хочу посмотреть, где этот очиститель дает сбой. Он использует белый список, чтобы разрешить только безобидные встроенные функции, и немедленно завершает работу, если вызываются какие-либо свойства dunder. (Примечание: причина, по которой он ищет строку .__, а не только __, заключается в том, что я хочу разрешить такие вещи, как foo.bar__baz).

Код: Выделить всё

def safe_eval(code: str) -> Any | None:
if '.__' in code:
raise ValueError

allowed_builtins = [
'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr',
'complex', 'dict', 'divmod', 'enumerate', 'filter', 'float', 'format', 'frozenset',
'hasattr', 'hash', 'hex', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list',
'map', 'max', 'min', 'next', 'object', 'oct', 'ord', 'pow', 'range', 'repr', 'reversed',
'round', 'set', 'slice', 'sorted', 'str', 'sum', 'tuple', 'zip'
]

return eval(
code,
globals={
'__builtins__': {
builtin : getattr(__builtins__, builtin) for builtin in allowed_builtins
}
},
locals={},
)
Re: «Почему вы хотите это сделать?» Я хочу иметь возможность фильтровать объекты Python на основе пользовательского ввода. Эти объекты являются «полезными нагрузками» для «сеансов» в приложении, что позволяет пользователям фильтровать сеансы на основе произвольных выражений в содержимом полезных данных, например len(payload.things) > 12 — была бы полезная функция.
Поэтому мой вопрос: какая входная строка позволит злоумышленнику получить доступ к данным «вне» eval, т.е. переменные в скрипте или доступ к ОС?

Подробнее здесь: https://stackoverflow.com/questions/793 ... on-dunders
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»