use la cadena generada raw_input de forma segura (Python)

Me pregunto cómo usar una cadena de raw_input de manera segura para poder crear una función para reemplazarla por un script que debe usarse de manera fácil y segura.

La razón es que estoy tratando de crear una aplicación de generación de hojas de caracteres usando python y necesito poder obtener el nombre completo de un personaje para pasar como una cadena usando un nombre para facilitar el acceso (Charname_NLB)

Sin embargo, como busco usar esto para más que esa aplicación, necesito que se pueda usar para cualquier cadena ingresada como entrada sin procesar, usando este comando alternativo.

Ya tengo una pieza similar hecha para la entrada de números enteros y me gustaría integrarla en la misma clase, por simplicidad. Lo publicaré aquí, gracias a: Mgilson y BlueKitties (desde aquí y www.python-forum.org respectivamente)

    def safeinput(get_num):
            num = float(raw_input(get_num))
            return num

Sin embargo, si esto no arrojara el mismo resultado que el comando de entrada base de manera segura, ¿podría obtener una copia de trabajo, ya que actualmente solo tengo una prueba de concepto con la que trabajar y no sería precisa con números truncados?

**Editar: Por "Cualquier cadena", me refiero específicamente a que el resultado se almacenará como una cadena, no se usará como un comando.

preguntado el 24 de agosto de 12 a las 06:08

Buenos días. ¿Cuál es tu pregunta? -

Cuando dice "cualquier cadena", ¿está incluyendo el código Python ejecutable? O solo literales como enteros, flotantes, listas, cadenas... -

si desea ingresar el código python ejecutable, puede usar 'input ()' en lugar de 'raw_input ()' -

Zagorulkin: Pero eso no sería seguro. Creo que la idea es usar eval en la cadena de entrada, pero previene cualquier comportamiento malicioso. (Como dije, esto sería posible si solo quiere que se ingresen literales, pero si realmente quiere poder proporcionar código de Python...) -

eliminar sys.path y ejecutar en un sandbox? (como aquí: stackoverflow.com/questions/4558104/…) -

1 Respuestas

No estoy seguro si esto es lo que estás pidiendo. literal_eval es seguro, pero solo funciona para literales. es muy dificil de usar eval() con seguridad si hay que higienizar la entrada

>>> from ast import literal_eval
>>> def safeinput(s):
...     try:
...         return literal_eval(s)
...     except:
...         return s
... 
>>> repr(safeinput("1"))
'1'                                            # converted to an int
>>> repr(safeinput("1.1"))
'1.1'                                          # converted to a float
>>> repr(safeinput("'some string in quotes'"))
"'some string in quotes'"                      # converted to a string
>>> repr(safeinput("some string without quotes"))
"'some string without quotes'"                 # no conversion necessary

Respondido 24 ago 12, 07:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.