建议对传递给外壳的user_input_parameter进行消毒的推荐方法是什么
subprocess.Popen(['sudo', 'rm -rf', user_input_parameter])
该命令应接受所有参数,但应减轻恶意活动,例如破坏该命令的行为。
答案 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])