Взлом через input()

Проводил пробное собеседование по python для своего менти - узнал новое :) Как то коснулись темы форматирования строк, он быстро накидал примеры на f-strings, format() и %, и в конце - “… но если это именно пользовательский ввод, то безопаснее использовать шаблонные строки (template strings)”. Спрашиваю -“Подожди, что значит безопаснее? Какие могут быть риски?”

И он выдаёт красивый пример, как можно вытащить ключ из кода, используя форматную строку.

# Ваш секретный пароль
SECRET = "секретный пароль"


class Error:
    def __init__(self):
        pass


err = Error()

# Если ввести форматную строку '{error.__init__.__globals__[SECRET]}'
# , она может считать данные из общего словаря:
user_input = input("Введите свой текст:")

print("Ваш текст:")
print(user_input.format(error=err))

# Вывод: 'секретный пароль'

Да, если подумать, вероятность низкая - слишком много всего должно совпасть, чтобы это сработало. Но, красиво :)

Written on April 4, 2024