Python/Django - 避免在源代码中保存密码

Posted

技术标签:

【中文标题】Python/Django - 避免在源代码中保存密码【英文标题】:Python/Django - Avoid saving passwords in source code 【发布时间】:2013-02-25 23:47:45 【问题描述】:

我使用 Python 和 Django 创建 Web 应用程序,我们将其存储在源代码控制中。通常设置 Django 的方式,密码在 settings.py 文件中是纯文本的。

以纯文本形式存储我的密码会使我面临许多安全问题,特别是因为这是一个开源项目,而且我的源代码将受到版本控制(通过 git,在 Github 上,全世界都可以看到! )

问题是,在 Django/Python 开发环境中安全地编写 settings.py 文件的最佳实践是什么?

【问题讨论】:

【参考方案1】:

虽然我在 *** 上没有遇到任何 Python 特定的内容,但我确实找到了 website that was helpful,并认为我会与社区的其他人分享解决方案。

解决方案:环境变量。

注意:尽管 Linux/Unix/OS X 和 Windows 世界中的环境变量相似,但我还没有在 Windows 机器上测试过这段代码。请让我知道它是否有效。

在你的 bash/sh shell 中,输入:

export MYAPP_DB_USER='myapp'
export MYAPP_DB_PASSWORD='testing123'

在你的 Django settings.py 文件中:

DATABASE_USER = os.environ.get("MYAPP_DB_USER", '')
DATABASE_PASSWORD = os.environ.get("MYAPP_DB_PASSWORD", '')

在这种情况下,如果环境变量不存在,用户名和密码将默认为空字符串。

【讨论】:

...以及您设置为 .gitignore 密码的文件 具体看两勺代码on their github @MichaelC.O'Connor 该死的,我在找那个,呵呵 这种方法的缺点是错误报告电子邮件会泄露环境变量。 如果这个项目需要托管在云服务器上怎么办?我将如何在那里导出环境变量?【参考方案2】:

虽然环境变量方便很多配置,但是把密码放到环境变量里就是notsecure。替代方案是常规版本控制之外的配置文件,这里有一些不同的缺点:

环境变量可能会意外泄漏(通过调试通道,可能通过明文传输给最终用户,或文件系统中的意外位置,如 ~/.*sh_history)。

配置文件可能会意外添加到版本控制中,并最终进入没有部署权限的人可以访问的存储库中。

阅读博文Environment Variables Considered Harmful for Your Secrets 了解更多论点:环境可供整个进程访问,继承给子(可能还有第 3 方)进程,并且外部开发人员没有明确假设将环境变量视为保密。

Python中最简单的配置文件格式就是a Python module。

【讨论】:

【参考方案3】:

这是一个老问题,问我的人肯定已经找到了解决这个问题的方法,但我自己查了一下,发现这里的答案并不是我一直在寻找的解决方案可能会添加我为任何其他可能提出相同问题的人所做的事情。

我所做的是使用 getpass() 让设置文件在启动时要求输入密码。

from getpass import getpass

#[...]

    DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql', #or whatever DB you use
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': getpass(),
        'HOST': '',
        'PORT': '',
    

【讨论】:

【参考方案4】:

在你的 settings.py 中有这样的东西:

db_user = 'my_db_user' db_password = 'my_db_password'

在您的代码中硬编码有价值的信息,并且确实会带来安全风险。另一种方法是将有价值的信息(Api 密钥、数据库密码等)作为环境变量存储在本地计算机上。例如。在 linux 上你可以添加:

export DB_USER = "my_db_user" export DB_PASS = "my_db_password"

到您的 .bash_profile。或者您的托管服务提供商通常可以选择设置环境变量,例如使用 AWS elastic beanstalk,您可以在控制台的配置下添加环境变量。

然后检索你的信息导入操作系统:

import os db_user = os.environ.get['DB_USER'] db_password = os.environ.get['DB_PASS']

【讨论】:

你确定 export DB_USER = "my_db_user" 必须 my_db_user in str

以上是关于Python/Django - 避免在源代码中保存密码的主要内容,如果未能解决你的问题,请参考以下文章

python django 怎么把数据查询结果保存到一个list里面

Python3+Django1.10+mysqlclient1.3.9:无法保存表情符号

python django检查模型在保存时更改

python - django 设置自定义文件保存路径

从 iPhone 到 Python/Django 的表情符号

python Django的实现图片的上传,保存和展示