【发布时间】:2011-04-02 04:55:37
【问题描述】:
默认情况下,Django 数据库主机/用户/密码以纯文本形式存储在项目 settings.py 文件中。
目前我似乎想不出更好的方法,但这似乎违反了密码存储的最佳做法。当然,如果攻击者可以访问设置文件,那么一切都可能已经丢失。即使文件被加密,到那时攻击者也可能有办法解密它。
这样好吗?
【问题讨论】:
标签: database django security passwords
默认情况下,Django 数据库主机/用户/密码以纯文本形式存储在项目 settings.py 文件中。
目前我似乎想不出更好的方法,但这似乎违反了密码存储的最佳做法。当然,如果攻击者可以访问设置文件,那么一切都可能已经丢失。即使文件被加密,到那时攻击者也可能有办法解密它。
这样好吗?
【问题讨论】:
标签: database django security passwords
是的,这是任何数据库通信程序的标准程序。真的没有“更好的方法”来做到这一点。
有一些方法可以帮助防止无效主机连接(IP 表、私有 IP 地址),但实际的连接详细信息几乎总是纯文本。
将文件存储在 web 根目录之外会有所帮助,但如果攻击者可以访问文件系统,那就没关系了。
【讨论】:
您是正确的,以纯文本和 settings.py 文件存储密码不是很好的安全性。您可以通过以下方式提高安全性:
正确设置权限(这取决于您的设置)。理想情况下,只有 python 应该能够读取该文件。
将文件存储在 www 或 htdocs 根目录之外。如果此时攻击者仍然可以访问它们,那么无论如何你都完蛋了。
为了增加安全性,您可以使用对称加密(例如:AES)对连接设置进行加密。将密钥存储在其他地方。因此,即使有人设法访问了连接设置,他们仍然需要找到密钥。主要缺点是现在你必须重写连接方法。
【讨论】:
由 Heroku recommends 编码的 Twelve-Factor App
配置与代码的严格分离。
这对于凭证管理尤为重要,理想情况下,不应将其提交给源代码控制。
django-environ 库提供了一种很好的方法,可以将大多数特定于环境的配置从 settings.py 文件中提取出来,但是您可以通过使用标准 os 库引用最敏感的位来走很长的路,例如'PASSWORD': os.environ['DBPASS']
当然,您可能仍会将一些密码以纯文本的形式存储在某处,但如果该文件未嵌入到您的代码库中,则泄露的可能性要小得多。
【讨论】: