从here,我们将所有数据库信息添加为文本:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
这是一种安全的方式吗?有没有办法将这些数据保存为加密数据?
答案 0 :(得分:5)
它不安全,任何有权访问您的源代码管理的人现在都可以访问您的数据库。
存储敏感数据的两种主要方法是使用环境变量或通过json文件
摘自Settings - Hiding secret data using a JSON file。原作者是Antoine Pinsard和fredley。归因详情可在contributor page上找到。该来源在CC BY-SA 3.0下获得许可,可以在Documentation archive中找到。参考主题ID:942和示例ID:8734。
使用JSON文件隐藏机密数据
当使用诸如Git或SVN之类的VCS时,有些秘密数据绝不能被版本化(无论存储库是公共的还是私有的)。
在这些数据中,您可以找到SECRET_KEY
设置和数据库密码。
从版本控制中隐藏这些设置的一般做法是在项目的根目录(thanks "Two Scoops of Django" for the idea)创建文件secrets.json
:
{
"SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
"DB_PASSWORD": "v3ry53cr3t"
}
并将其添加到您的忽略列表中(git为.gitignore
):
*.py[co]
*.sw[po]
*~
/secrets.json
然后将以下函数添加到settings
模块:
import json
import os
from django.core.exceptions import ImproperlyConfigured
with open(os.path.join(BASE_DIR, 'secrets.json')) as secrets_file:
secrets = json.load(secrets_file)
def get_secret(setting, secrets=secrets):
"""Get secret setting or fail with ImproperlyConfigured"""
try:
return secrets[setting]
except KeyError:
raise ImproperlyConfigured("Set the {} setting".format(setting))
然后以这种方式填充设置:
SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgres',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': get_secret('DB_PASSWORD'),
},
}
摘自Settings - Using Environment variables to manage Settings across servers。原作者是sudshekhar,ssice和NBajanca。归因详情可在contributor page上找到。该来源在CC BY-SA 3.0下获得许可,可以在Documentation archive中找到。参考主题ID:942和示例ID:3580。
使用环境变量管理跨服务器的设置
使用环境变量是一种广泛使用的方法,可根据环境设置应用程序的配置,如The Twelve-Factor App中所述。
由于配置可能会在部署环境之间发生变化,因此这是一种非常有趣的方式来修改配置,而无需深入挖掘应用程序的源代码,并将秘密保存在应用程序文件和源代码存储库之外。
在Django中,主要设置位于项目文件夹中的settings.py
。由于它是一个简单的Python文件,您可以使用标准库中的Python os
模块来访问环境(甚至具有适当的默认值)。
import os
SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')
DEBUG = os.environ.get('DJANGO_DEBUG', "True") == "True"
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split()
DATABASES = {
'default': {
'ENGINE': os.environ.get('APP_DB_ENGINE', 'django.db.backends.sqlite3'),
'NAME': os.environ.get('DB_NAME', 'db.sqlite'),
'USER': os.environ.get('DB_USER', ''),
'PASSWORD': os.environ.get('DB_PASSWORD', ''),
'HOST': os.environ.get('DB_HOST', None),
'PORT': os.environ.get('DB_PORT', None),
'CONN_MAX_AGE': 600,
}
}
使用Django,您可以更改数据库技术,以便在开发计算机上使用sqlite3(这应该是提交源控制系统的理想默认值)。虽然这是可能的,但不建议:
备份服务(例如应用程序的数据库,排队系统或缓存)是dev / prod奇偶校验非常重要的一个领域。 (The Twelve-Factor App - Dev/prod parity)
答案 1 :(得分:0)
感谢 Sayse 使用环境变量的奇妙想法。对于那些使用Pycharm连接到mysql数据库的用户,需要创建一个“ USER”环境变量,并使用 os.environ.get('environment variable','')调用它。避免将数据库密码存储在settings.py中。
答案 2 :(得分:0)
否,它不安全。
您不得将这些信息上传到互联网。
我经常做的是:
在根目录中添加环境文件。
例如,如果项目名为MYPROJECT
该环境文件的目录为MYPROJECT / env
将环境文件添加到.gitignore文件中。
我使用数据库url形式,发现它更优雅,行更少。
要使用它,请输入:
pip install dj_database_url
将此行添加到settings.py
import dj_database_url
然后以简单优雅的形式表示:
DATABASES = { 'default': dj_database_url.config(default='postgres://user:password@localhost:5432/database_name'), }
现在,用关键字替换网址,并将网址安全地隐藏在env文件中,如下所示:
DATABASES = { 'default': dj_database_url.config(default=os.environ.get('DATABASE_URL')), }
注意:这样一来,您只键入os.environ.get()一次。
转到环境文件并添加:
export DATABASE_URL='postgres://user:password@localhost:5432/database_name'
不要忘记!让我们向终端介绍这些关键字!在项目目录中输入终端:
source env
祝你好运。