Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python3-作为参数传递给shell的清理用户输入_Python 3.x_Security_Sanitization - Fatal编程技术网

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

Python 3.x Python3-作为参数传递给shell的清理用户输入,python-3.x,security,sanitization,Python 3.x,Security,Sanitization,建议使用什么方法清理传递给类shell的用户输入参数 subprocess.Popen(['sudo', 'rm -rf', user_input_parameter]) 命令应接受所有参数,但应减轻恶意活动(如破坏命令)的影响。Python对子流程的实现可防止shell注入,如是说: 17.5.2. 安全考虑 与其他一些popen函数不同,此实现永远不会 隐式调用系统shell。这意味着所有角色, 包括shell元字符,可以安全地传递给子对象 过程。如果通过shell=True显式调用she

建议使用什么方法清理传递给类shell的用户输入参数

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

命令应接受所有参数,但应减轻恶意活动(如破坏命令)的影响。

Python对
子流程的实现可防止shell注入,如是说:

17.5.2. 安全考虑 与其他一些popen函数不同,此实现永远不会 隐式调用系统shell。这意味着所有角色, 包括shell元字符,可以安全地传递给子对象 过程。如果通过
shell=True
显式调用shell,则 应用程序有责任确保所有空格和 适当引用元字符以避免 脆弱性

使用
shell=True
时,该函数可用于 正确转义字符串中的空格和shell元字符 将用于构造shell命令

然而,这并不能防止用户传递恶意输入—例如,在您的情况下,删除不打算删除的内容。我不会像那样直接将用户输入传递给命令-您应该验证您想要删除的内容是否正在被删除,而不是完全不同的内容。然而,这已经是应用程序逻辑的一部分了——关于shell注入(中断命令)——对于
子流程来说应该没问题

我举了一个小例子:

#!/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
$
要演示
子流程,请将输入作为参数传递给参数

只有当
子流程
方法的
shell=False
(编写此答案时的默认值)时,所有这些才是正确的,否则基本上启用shell(bash等)执行,并允许在输入未正确清理时发生注入


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

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