2011-04-07 9 views
9

Me tropecé con la siguiente advertencia cuando estaba leyendo Code Like a Pythonista: Idiomatic Python por David Goodger.¿Cómo se puede explotar locals() en código python?

extracto del artículo ...

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

Esto es muy poderoso. Con esto, usted puede hacer todo el formato de cadena que quiere sin tener que preocuparse por que coincida con los valores de interpolación la plantilla.

Pero la potencia puede ser peligrosa. "Con gran poder viene muy bien responsabilidad". Si utiliza el locals() con una cadena de plantilla suministrada externamente , expone todo su espacio de nombre local a la persona que llama. Esto es solo algo a tener en cuenta.

Estoy tratando de comprender los escenarios específicos en el que el uso de locals() pueden ser peligrosos. Se aprecia cualquier ejemplo de cómo se puede explotar la presencia de locals() en un código. ¡Gracias!

Respuesta

4

Un ejemplo sencillo: si tiene algo de magia cifrado importante de ultra clave enc_key en el espacio de nombres local de una aplicación web-view y que utilizaría una cadena suministrada por el usuario de esta manera:

a_var_that_gets_display = user_supplied_string % locals() 

Que un atacante podría pase algo como Encryption key is %(enc_key)s como user_supplied_string y obtendría su clave.

Admito que este es un ejemplo altamente improbable y construido. Generalmente, el uso de locals() se guarda siempre que no utilice los datos proporcionados por el usuario como cadena de formato.

6

la muestra, código 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() 

Considere el caso en que entered_pw es %(real_pw)s

Cuestiones relacionadas