In [11]:
import subprocess
def subprocess_test(myserver):
info=subprocess.check_output('ping %s' % myserver, shell=True)
print(info.decode('GBK'))
subprocess_test('114.114.114.114')
QA有话说¶
这个程序接受了变量为myserver的输入,执行了ping命令。但是输入和输出并没有做校验,check_output方法并不知道命令的起始位置是什么。
我们假定myserver这个变量是由用户输入的,则这段程序可被用来执行任何命令。
In [13]:
subprocess_test('114.114.114.114 && dir')
QA使用了一个没破坏性的命令,如果是删除文件之类敏感的操作,则可能会带来灾难。
高级程序员的写法¶
In [18]:
def subprocess_test_safe(myserver):
args=['ping',myserver]
info=subprocess.check_output(args, shell=False)
print(info.decode('GBK'))
subprocess_test_safe('114.114.114.114')
print('--------------------分割线----------------------')
subprocess_test_safe('114.114.114.114 && dir')
通过将参数列表化,而不是直接将字符串传递给子进程,ping命令分别获取每个参数,因此Shell不会在ping命令执行结束后执行其它命令。这里的Shell默认为False,如果将其设置为True,将会更容易受到攻击。