Python3-清理作为参数传递给shell的用户输入

时间:2018-08-25 18:03:25

标签: python-3.x security sanitization

建议对传递给外壳的user_input_parameter进行消毒的推荐方法是什么

subprocess.Popen(['sudo', 'rm -rf', user_input_parameter])

该命令应接受所有参数,但应减轻恶意活动,例如破坏该命令的行为。

1 个答案:

答案 0 :(得分:0)

Python的subprocess实现防止外壳注入,documentation这样说:

  

17.5.2。安全注意事项

     

与其他一些popen函数不同,此实现永远不会   隐式调用系统外壳。这意味着所有字符,   包括外壳元字符,可以安全地传递给孩子   流程。如果外壳程序是通过shell=True显式调用的,则为   应用程序有责任确保所有空白和   适当引用元字符以避免shell injection   漏洞。

     

使用shell=True时,shlex.quote()函数可用于   在字符串中正确地转义空格和外壳元字符   将用于构造Shell命令。

但是,这将不能防止用户传递恶意输入-例如,在您的情况下,删除不希望删除的内容。我不会像这样直接将用户输入传递给命令-您应该验证是否要删除任何要删除的东西,而不是完全不同的东西。但是,这已经是应用程序逻辑的一部分-关于shell注入(脱离命令)-用subprocess应该没问题。

我做了这个小例子:

#!/usr/bin/env python3

import subprocess

user_input_parameter = '/; id'
subprocess.Popen(['ls', user_input_parameter])

执行时输出以下内容:

$ python3 asdf.py
ls: /; id: No such file or directory
$

为演示subprocess将输入作为参数传递给参数。

如果shell=False方法使用subprocess(写此答案时的默认值),则所有这些都是 only ,否则,您基本上启用了shell(bash等)执行并允许在未正确清洁输入物的情况下进行注射。


顺便说一句,您需要分别传递每个参数,因此您需要像这样运行它(但请不要这样做):

subprocess.Popen(['sudo', 'rm', '-rf', user_input_parameter])