os.system(f"{var}") 会公开变量 (print/stdout) 吗?
Will os.system(f"{var}") expose the variable (print/stdout)?
我有一些关于 python 的安全问题 os.system
。
由于找不到答案,我想请求您的帮助。
所以我将数据库的用户名和密码存储为环境变量。
然后我想用 shell 语句启动服务器:
os.system(f"server --host 0.0.0.0 " f"{db_type}://{db_user}:{db_pw}@host")
我删除了声明的某些部分,因为它们与这个问题无关。
我的问题是:
我的变量 db_user
或 db_pw
会暴露在某处吗?我担心 os.system
将使用明确的变量打印或标准输出整个语句。
如果是这样,有什么办法可以预防吗?
代码将 运行 放在 ec2/aws 上。
我知道还有其他启动服务器的方法,但我对这个特定场景很感兴趣。
是的,内容会暴露。 stdout/err上没有具体介绍,但是可以看看内容。
举个例子
password='secret'
os.system(f"echo {password} && sleep 1000")
这将在新的子 shell 中启动命令(根据 documentation)。此进程现在 运行,因此它将在 运行ning 进程列表中可见。例如开始 top
或 htop
并搜索该进程。
这可能会显示如下内容:
在那里你可以看到password
变量的内容。
这是因为首先对 os.system
的完整字符串参数进行求值和替换。然后将该字符串传递给 sh
以启动一个新的子 shell。
由于 unix 用户可以列出机器进程,因此通过 cli 参数传递秘密绝不是一个好主意。也没有通过 ENV 变量传递,因为您可以通过 cat /proc/{$pid}/environ
检查环境。
最好的方法是通过标准输入将数据传递给子进程。
我有一些关于 python 的安全问题 os.system
。
由于找不到答案,我想请求您的帮助。
所以我将数据库的用户名和密码存储为环境变量。 然后我想用 shell 语句启动服务器:
os.system(f"server --host 0.0.0.0 " f"{db_type}://{db_user}:{db_pw}@host")
我删除了声明的某些部分,因为它们与这个问题无关。
我的问题是:
我的变量 db_user
或 db_pw
会暴露在某处吗?我担心 os.system
将使用明确的变量打印或标准输出整个语句。
如果是这样,有什么办法可以预防吗?
代码将 运行 放在 ec2/aws 上。 我知道还有其他启动服务器的方法,但我对这个特定场景很感兴趣。
是的,内容会暴露。 stdout/err上没有具体介绍,但是可以看看内容。 举个例子
password='secret'
os.system(f"echo {password} && sleep 1000")
这将在新的子 shell 中启动命令(根据 documentation)。此进程现在 运行,因此它将在 运行ning 进程列表中可见。例如开始 top
或 htop
并搜索该进程。
这可能会显示如下内容:
在那里你可以看到password
变量的内容。
这是因为首先对 os.system
的完整字符串参数进行求值和替换。然后将该字符串传递给 sh
以启动一个新的子 shell。
由于 unix 用户可以列出机器进程,因此通过 cli 参数传递秘密绝不是一个好主意。也没有通过 ENV 变量传递,因为您可以通过 cat /proc/{$pid}/environ
检查环境。
最好的方法是通过标准输入将数据传递给子进程。