我刚开始使用Django项目,在项目的settings.py文件中,daabase部分如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'blogengine', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'blogadmin',
'PASSWORD': 'blog@123',
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '3306', # Set to empty string for default.
}
}
无论如何,我不需要输入明文密码,但可能以某种加密形式输入密码?
答案 0 :(得分:9)
尝试保护该密码毫无意义。
该文件中可用于访问数据库的任何标记都可供其他任何人使用来访问数据库。这就是共享秘密安全的工作原理。用随机生成的令牌替换密码,例如,您仍然必须将该令牌传递给settings.py
。
最好的办法是使用该用户名和密码限制计算机可以连接到MySQL数据库,从而增加额外的安全层。哦,确保没有人可以通过正确保护您的网络服务器和源代码控制系统来访问settings.py
。
答案 1 :(得分:6)
你可以做的另一件事是不将你的密码/令牌存储在settings.py中,这对于安全性来说是一种不好的做法,而不是那样,你应该在运行你的app的用户中创建一个环境变量,让我们说:
export MYSQL_PASSWORD=1234
从你的django应用程序中读取它如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'blogengine', # Or path to database file if using sqlite3.
# The following settings are not used with sqlite3:
'USER': 'blogadmin',
'PASSWORD': os.getenv('MYSQL_PASSWORD'),
'HOST': 'localhost', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
'PORT': '3306', # Set to empty string for default.
}
}
您应该为所有“敏感数据”执行此操作,例如EMAIL_HOST_PASSWORD,AWS令牌和机密以及此类内容,这样您就可以将配置与环境分开,而无需在测试服务器中更改这些参数或者在本地环境中,您只需确保您的环境变量相同,但根据您的环境指向正确的位置。