Python/Django - Avoid saving passwords in source code
我使用python和django创建Web应用程序,我们将其存储在源代码管理中。通常设置Django的方式是,密码在settings.py文件中为纯文本。
将我的密码以纯文本形式存储将使我面临许多安全问题,特别是因为这是一个开源项目,我的源代码将受到版本控制(通过Git,在GitHub上,让全世界都能看到!)
问题是,在django/python开发环境中安全地编写settings.py文件的最佳实践是什么?
虽然我在stackoverflow上没有遇到任何特定于python的东西,但我确实找到了一个有用的网站,我认为我可以与社区的其他人共享这个解决方案。
解决方案:环境变量。
注意:尽管Linux/Unix/OSX和Windows世界中的环境变量都很相似,但我还没有在Windows机器上测试过这段代码。如果可以的话请告诉我。
在bash/sh shell中,键入:
1 2 | export MYAPP_DB_USER='myapp' export MYAPP_DB_PASSWORD='testing123' |
在django settings.py文件中:
1 2 | DATABASE_USER = os.environ.get("MYAPP_DB_USER", '') DATABASE_PASSWORD = os.environ.get("MYAPP_DB_PASSWORD", '') |
在这种情况下,如果环境变量不存在,用户名和密码将默认为空字符串。
虽然环境变量对于很多配置都很方便,但是在环境变量中输入密码是不安全的。另一种选择是常规版本控制之外的配置文件,这里有一些不同的缺点:
环境变量可能会意外泄漏(通过调试可能通过明文传输到最终用户或文件系统中的意外位置,如~/.*sh_history)。
配置文件可能会意外地添加到版本控制中,并最终进入不具有部署特权的人可以访问的存储库。
阅读博客文章环境变量被认为对你的秘密有害的更多论据:环境可以被整个过程访问,继承到子进程(可能是第三方进程),并且外部开发人员不存在将环境变量视为机密的明确假设。
python中最简单的配置文件格式就是python模块。