2014-01-09 51 views
1

我明白为什么使用'shell = True'可能会导致安全风险,如果您有不可信的输入。但是,我不明白“shell = False”如何避免相同的风险。Python子流程安全

据推测,如果我想允许用户提供输入他可能输入:VAR =“室射频/”

我的代码可能只是:

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

或者我可以做:

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

这似乎是假设是不会经过处理输入的麻烦,如我在第二个例子中所做的,因此这将不会发生?

+0

ummmm你逝去的不受信任的输入您正在运行显著风险呼叫....你在哪里任何时候听到shell = False使它安全? http://docs.python.org/2/library/subprocess.html#frequently-used-arguments ...它所做的就是停止shell注入,这只是一次攻击...... –

+0

你提供的链接有一个注释说:“警告: 如果与不可信输入组合,调用shell = True的系统shell可能会带来安全隐患。”这意味着我使用shell = False提供了一些防御。 – user3175543

回答

4

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

因此,举例来说,

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

调用cat程序并发送3串'nonexistent;''rm''-rf'作为参数cat。这是非常安全的,尽管无效,因为-r是对cat的无效选项。

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

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

这是很好的信息。所以我猜用户输入的用例应该是允许用户“完成”一个预定义的命令,而不是“提供”一个。我正在使用XML文件来提供一些shell命令,它允许我测试操作系统中是否满足某些任意条件。该命令可能是一组管道命令。这使得用'shell = False'读取和执行命令变得困难。我只是想知道,如果shell = False提供了一些内在的防御措施来防止像'rm -rf /'这样的危险命令。 – user3175543

+0

如果XML指定要运行的命令,那么执行'subprocess.call'具有固有的危险性。也许你可以将脚本作为[有限权限的用户]来运行(http://askubuntu.com/questions/253027/how-to-sandbox-bash-shell-to-affect-only-current-directory)。 – unutbu