安全使用原始输入生成的字符串(Python)

安全使用原始输入生成的字符串(Python),python,user-input,raw-input,Python,User Input,Raw Input,我想知道如何安全地使用原始输入中的字符串,这样我就可以创建一个函数来替换脚本中的字符串,以便轻松安全地使用它 原因是我正在尝试使用python制作一个字符表生成应用程序,并且需要能够使用一个易于访问的名称(Charname_NLB)将字符的全名作为字符串传递 但是,由于我希望将其用于更多的应用程序,因此我需要使用此替代命令,使其可用于作为原始输入输入的任何字符串 我已经有一个类似的整型输入,为了简单起见,我想把它集成到同一个类中。我将把它贴在这里,感谢:Mgilson和BlueKitties(分

我想知道如何安全地使用原始输入中的字符串,这样我就可以创建一个函数来替换脚本中的字符串,以便轻松安全地使用它

原因是我正在尝试使用python制作一个字符表生成应用程序,并且需要能够使用一个易于访问的名称(Charname_NLB)将字符的全名作为字符串传递

但是,由于我希望将其用于更多的应用程序,因此我需要使用此替代命令,使其可用于作为原始输入输入的任何字符串

我已经有一个类似的整型输入,为了简单起见,我想把它集成到同一个类中。我将把它贴在这里,感谢:Mgilson和BlueKitties(分别来自这里和www.python-forum.org)

但是,如果这不能安全地返回与基本输入命令相同的结果,我是否可以获得一个工作副本,因为我目前只有一个概念证明可供使用,并且对于截断的数字来说,它将不准确


**编辑:“任何字符串”,我的具体意思是,结果将存储为字符串,而不是用作命令。

不确定这是否是您所要求的
literal\u eval
是安全的,但仅适用于文本。如果必须对输入进行消毒,则很难安全地使用
eval()

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

很好的一天。你的问题是什么?当你说“任何字符串”-你包括可执行的Python代码吗?或者只输入诸如int、float、list、string之类的文本……如果您想输入可执行的python代码,可以使用“input()”而不是“raw_input()”Zagorulkin:但这并不安全。我认为这样做的目的是在输入字符串上使用
eval
,但防止任何恶意行为。(如我所说,如果他只想输入文本,这是可能的,但如果他真的想提供Python代码……)删除sys.path并在沙箱中执行?(比如这里:)
>>> 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