2011-04-07 2 views
9

Je suis tombé sur l'avertissement suivant lorsque je lisais Code Like a Pythonista: Idiomatic Python par David Goodger.Comment les locals() peuvent-ils être exploités en code python?

Extrait de l'article ...

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

Ceci est très puissant. Avec cela, vous pouvez faire tout le formatage de chaîne voulez sans avoir à vous soucier de correspondant aux valeurs d'interpolation à le modèle.

Mais l'alimentation peut être dangereuse. "Avec une grande puissance vient grande responsabilité." Si vous utilisez le locals() à partir d'un chaîne de modèle fournie en externe, vous exposer l'intégralité de votre espace de noms local à l'appelant. C'est juste quelque chose à garder à l'esprit.

Je suis en train de comprendre les scénarios spécifiques dans lequel l'utilisation locals() peut être dangereux. Des exemples de la manière dont la présence de locals() dans un code peut être exploitée sont appréciés. Merci!

Répondre

4

Un exemple simple: Si vous avez une clé magique cryptage ultra importante enc_key dans votre espace de noms local d'une webapp vue et que vous utilisez une chaîne fournie par l'utilisateur ainsi:

a_var_that_gets_display = user_supplied_string % locals() 

qu'un attaquant pourrait passer quelque chose comme Encryption key is %(enc_key)s comme user_supplied_string et obtiendrait votre clé. J'admets que c'est un exemple hautement improbable et construit. Généralement en utilisant locals() est enregistrer tant que vous n'utilisez pas les données fournies par l'utilisateur en tant que chaîne de format.

6

Sample, le code trivial:

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() 

Considérons le cas où entered_pw est %(real_pw)s

Questions connexes