use la cadena generada raw_input de forma segura (Python)
Frecuentes
Visto 654 veces
1
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.
1 Respuestas
3
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 python user-input raw-input or haz tu propia pregunta.
Buenos días. ¿Cuál es tu pregunta? - Dmitry Zagorulkin
Cuando dice "cualquier cadena", ¿está incluyendo el código Python ejecutable? O solo literales como enteros, flotantes, listas, cadenas... - David Robinson
si desea ingresar el código python ejecutable, puede usar 'input ()' en lugar de 'raw_input ()' - Dmitry Zagorulkin
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...) - David Robinsoneliminar sys.path y ejecutar en un sandbox? (como aquí: stackoverflow.com/questions/4558104/…) - unddoch