我使用
在shell中执行一些代码subprocess.Popen('echo '+user_string+' | pipe to some string manipulation tools',
shell=True)
其中user_string来自不受信任的来源。
使用shlex.quote()
来逃避输入是否足够安全?
答案 0 :(得分:2)
我对此不屑一顾,因为它是Google所称“ shlex.quote()安全”最受关注的,虽然公认的答案似乎是正确的,但仍有很多陷阱要指出。
shlex.quote()
会转义外壳程序的解析,但不会转义您正在调用的命令的参数解析器,并且某些其他特定于工具的转义需要手动完成,特别是如果您的字符串以破折号开头(-
)。
大多数(但不是全部)工具接受--
作为参数,之后的所有内容都被逐字解释。如果字符串以"-- "
开头,则可以加上"-"
。示例:rm -- --help
删除名为--help
的文件。
在处理文件名时,如果字符串以"./"
:"-"
开头,则可以在rm ./--help
之前加上前缀。
在您使用echo
的示例中,两种转义都不足以:在尝试回显字符串-e
时,echo -- -e
给出错误的结果,您将需要类似{ {1}}。这表明没有通用的防弹方法可以逃避程序参数。
最安全的方法是通过避免 echo -e \x2de
或shell=True
(如果该字符串涉及用户提供的任何数据)来绕过外壳程序。
根据您的情况,设置os.system()
并将stdin=subprocess.PIPE
作为参数传递给user_string
。然后,您甚至可以使用communicate()
保留原来的调用:
shell=True
答案 1 :(得分:1)
根据shlex.quote
shlex.quote
,答案是肯定的。
当然,这也取决于你的意思"足够安全"。假设您的意思是"是否会user_string
使用UserControl
来防范我作为字符串输入传递给我的脚本的恶意shell代码的典型情况?"答案是肯定的。