Python 子进程安全性



我理解为什么如果你有不受信任的输入,使用'shell=True'可能会带来安全风险。 但是,我不明白"shell=False"如何避免相同的风险。

大概如果我想允许用户提供他可能会输入的输入:var="rm -rf/"

我的代码可能只是:

subprocess.call(var,shell=True) # bad stuff

或者我可能会这样做:

varParts=var.split()
subprocess.call(varParts,shell=False) # also bad, right?

似乎假设人们不会像我在第二个示例中那样经历处理输入的麻烦,因此这不会/不可能发生?

对于shell=Falseargs[0]是要执行的程序,args[1:]作为参数传递给该程序。

所以,例如,

subprocess.call(['cat','nonexistent;','rm','-rf'])

调用cat程序并将 3 个字符串'nonexistent;''rm''-rf'作为参数发送给cat。这是完全安全的,尽管无效,因为-rcat的无效选项。

但是,任意用户输入仍然可能不安全。例如,如果您允许用户控制要调用的程序,如

subprocess.call(['rm','-rf'])

最新更新