默认情况下,Django数据库主机/用户/密码以纯文本形式存储在项目settings.py文件中。
我现在似乎无法想到更好的方法,但这似乎违背了密码存储的最佳做法。当然,如果攻击者可以访问设置文件,那么所有人都可能已经丢失。即使文件是加密的,攻击者也可能有办法在那时解密它。
这可以吗?
答案 0 :(得分:24)
你是对的。但您可以通过以下方式提高安全性:
正确设置权限(这取决于您的设置)。理想情况下,只有python应该能够读取文件。
将文件存储在www
或htdocs
根目录之外。如果此时攻击者仍然可以访问它们,那么无论如何都会被搞砸。
为了增强安全性,您可以使用对称加密(例如:AES)加密连接设置。将密钥存储在其他位置。因此,即使有人设法访问连接设置,他们仍然需要找到密钥。主要缺点是现在你必须重写连接方法。
答案 1 :(得分:14)
Heroku编纂的Twelve-Factor App recommends
严格区分配置和代码。
这对于凭据管理尤其重要,理想情况下,永远不应将其提交给源代码控制。
django-environ库提供了一种很好的方法来从settings.py文件中提取大多数特定于环境的配置,但是你可以通过引用标准os库中最敏感的位来做很长的事情,例如: 'PASSWORD': os.environ['DBPASS']
当然,您可能仍然会在纯文本某处中存储一些密码,但如果该文件没有嵌入您的代码库中,那么它的可能性就会大大降低。
答案 2 :(得分:2)
是的,这是任何数据库通信程序的标准程序。真的没有“更好的方法”去做。
有一些方法可以帮助防止无效主机连接(ip表,私有IP地址),但实际的连接细节几乎总是纯文本。
将文件存储在Web根目录之外会对某些人有所帮助,但如果攻击者可以访问文件系统,则无关紧要。