subprocess shell=True的测试

本文通过测试探讨了在使用Python subprocess模块时避免使用shell=True的重要性。shell=True可能导致命令注入安全问题,例如,当命令字符串包含分隔符时,可能会执行多个命令。相反,shell=False更安全,它将命令参数作为数组传递,减少了潜在风险。示例代码展示了如何避免这种风险,强调了从外部源获取参数时应谨慎处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近用到了python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下:

  from subprocess import call
  import shlex

  cmd = "cat test.txt; rm test.txt"
  call(cmd, shell=True)

运行之后:
1:打开并浏览了test.txt文件
2:删除了test.txt文件

  from subprocess import call
  import shlex

  cmd = "cat test.txt; rm test.txt"
  cmd = shlex(cmd)
  call(cmd, shell=False)

运行之后:
1:尝试打开名为text.txt;的文件
2:尝试打开名为rm的文件
3:打开并浏览了test.txt文件


shell=True参数会让subprocess.call接受字符串类型的变量作为命令,并调用shell去执行这个字符串,第一个测试中的分号被认为是shell命令中的分隔符,执行了cat和rm两个命令。
当shell=False是,subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数,因此第二个测试只执行了cat命令,并试着打开了作为参数的”text.txt;”,”rm” , “text.txt”三个文件。
毫无疑问shell=False的参数能让你的程序更加安全,尤其是当你的cmd变量值是从外部读取到的时候。
假设你有这样的一个需求:让程序运行cat命令,cat的参数则是从一个文件里读取,那代码可能是这样子的

 from subprocess import call   

 param = file.readline()
 call(cat + param, shell = True)

一旦当param读取到了”a.txt; rm -rf /;b.txt”之类的字符串时,后果时毁灭性的……

  from subprocess import call
  import shlex

  param = file.readline()
  param = "cat " + param
  param = shlex(param)
  call(param, shell = False)

显然是更好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值