Python3 - 清理用户输入以供 shell 使用

Posted

技术标签:

【中文标题】Python3 - 清理用户输入以供 shell 使用【英文标题】:Python3 - Sanitizing user input for shell use 【发布时间】:2021-12-07 10:36:50 【问题描述】:

我正忙于编写需要用户输入的 Python3 脚本,输入用作传递给 shell 的命令中的参数。

该脚本仅供受信任的内部用户使用 - 但我宁愿有一些应急措施来确保命令的有效执行。

示例 1:

import subprocess

user_input = '/tmp/file.txt'
subprocess.Popen(['cat', user_input])

这将输出'/tmp/file.txt'的内容

示例 2:

import subprocess

user_input = '/tmp/file.txt && rm -rf /'
subprocess.Popen(['cat', user_input])

结果(如预期):

cat: /tmp/file.txt && rm -rf /: No such file or directory

这是一种可接受的输入净化方法吗?根据最佳实践,除此之外我还应该做些什么吗?

【问题讨论】:

不,不是来自文件。输入是通过终端中的交互式菜单输入的。我只是简化了我的问题。变量“user_input”只是表示用户应该输入到应用程序中的任何内容。 【参考方案1】:

你选择的方法,

import subprocess
user_input = 'string'
subprocess.Popen(['command', user_input])

非常好,因为command 是静态的,user_input 作为单个参数传递给command。只要你不做一些非常愚蠢的事情,比如

subprocess.Popen(['bash', '-c', user_input])

您应该注意安全。


对于需要多个参数的命令,我建议您向用户请求多个输入,例如这样做

user_input1='file1.txt'
user_input2='file2.txt'
subprocess.Popen(['cp', user_input1, user_input2])

而不是这个

user_input="file1.txt file2.txt"
subprocess.Popen(['cp'] + user_input.split())

如果您想进一步提高安全性,您可以:

明确设置shell=False(以确保您从不运行shell命令;这已经是当前默认值,但默认值可能会随着时间而改变):
subprocess.Popen(['command', user_input], shell=False)
使用command 的绝对路径(以防止通过PATH 注入恶意可执行文件):
subprocess.Popen(['/usr/bin/command', user_input])
明确指示支持它的命令停止解析选项,例如
subprocess.Popen(['rm', '--', user_input1, user_input2])
尽可能多地在本地做,例如cat /tmp/file.txt 可以改用几行 Python 代码来完成(如果这是一个因素,这也将增加可移植性)

【讨论】:

以上是关于Python3 - 清理用户输入以供 shell 使用的主要内容,如果未能解决你的问题,请参考以下文章

一种用户将选择存储为输入以供以后使用的方法

如何存储变量以供 Java Swing Gui 中的用户输入进一步使用?

Python3 错误和异常

何时最好清理用户输入?

用户登陆认证

Windows64位安装GPU版TensorFlow 0.12,Power Shell下输入:安装Tensorflow的全教程