2016-12-27 46 views
0

所以,当我在阅读python中的Subprocess的文档时,发生了这个问题。所以让我们来使用示例,因为程序员理解代码。调用预定义的字符串安全的shell?

from Subprocess import Popen, PIPE 

def connect_with_netCat(port, ip): 
    Popen('nc %s %s' % (ip, port), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 

我的问题;这是安全的吗?例如,我知道netcat是一个糟糕的选择,因为它也为攻击者留下了漏洞来调用该函数并连接到某个地方,但这是我首先想到的第一个示例包,但只是查看代码 - 是否安全因为它里面有不断的内容?

或者这会是一个更安全的方式吗?

def connect_with_netCat(port, ip): 
    from Subprocess import Popen, PIPE 
    Popen('nc %s %s' % (ip, port), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 

因为它不在全球范围内。只是一个奇怪的问题。

+0

使用'%d'而不是'%s',以便它始终格式化为一个数字。然后它不会意外地将其他字符串注入到shell中。 – Barmar

+0

糟糕,'ip'不是一个数字,它是一个主机名或IP。 – Barmar

回答

1

如果您确定ipport的来源是安全的,那么该命令应该是安全的。

为了更安全一些,您可以省略shell=True,因为您没有在命令中使用任何shell语法。这样,如果命令中有shell操作符,则不会被解释。

您还应该使用%d而不是%s作为端口,因为这需要是一个数字。