Как можно использовать locals () в коде Python? - PullRequest
9 голосов
/ 07 апреля 2011

Я наткнулся на следующее предупреждение, когда читал Код, похожий на Pythonista: Идиоматический Питон от David Goodger.

Отрывок из статьи ...

print('Hello %(name)s, you have %(messages)i messages' % locals())

Это очень сильно.Благодаря этому вы можете выполнять форматирование строк по своему усмотрению, не беспокоясь о соответствии значений интерполяции шаблону.

Но энергопотребление может быть опасным."С большой властью приходит большая ответственность."Если вы используете locals() from с предоставленной извне строкой шаблона, вы предоставляете вызывающему все ваше локальное пространство имен.Об этом нужно помнить.

Я пытаюсь понять конкретные сценарии , в которых использование locals() может быть опасным.Любые примеры того, как присутствие locals() в коде может быть использовано, приветствуются.Спасибо!

Ответы [ 2 ]

6 голосов
/ 07 апреля 2011

Пример, тривиальный код:

script_name = 'readpw.py'
...
entered_pw = raw_input()
if entered_pw != real_pw:
    print "%(script_name)s: The password you entered: "+entered_pw+" is incorrect."%locals()

Рассмотрим случай, когда значение input_pw равно %(real_pw)s

4 голосов
/ 07 апреля 2011

Простой пример: если в вашем локальном пространстве имен веб-приложения есть некий волшебный, чрезвычайно важный ключ шифрования enc_key, и вы будете использовать строку, указанную пользователем, следующим образом:

 a_var_that_gets_display = user_supplied_string % locals()

ЧемЗлоумышленник может передать что-то вроде Encryption key is %(enc_key)s как user_supplied_string и получить ваш ключ.

Я признаю, что это крайне маловероятный и сложный пример.Обычно использование locals() - это сохранение, если вы не используете предоставленные пользователем данные в качестве строки формата.

...