9

我刚开始一个 Django 项目,在项目的settings.py文件中,数据库部分如下所示:

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.
    }
}

有什么方法可以让我不必以明文形式输入密码,但可以以某种加密形式输入密码?

4

2 回答 2

10

试图保护该密码是没有意义的。

该文件中可用于访问数据库的任何令牌都可以被其他任何人用来访问数据库。这就是共享秘密安全的工作原理。将密码替换为随机生成的令牌,例如,您仍然必须将该令牌传达给settings.py

您最好的选择是限制哪些计算机可以使用该用户名和密码连接到您的 MySQL 数据库,从而增加额外的安全层。哦,settings.py通过正确保护您的网络服务器和源代码控制系统来确保没有人可以访问。

于 2013-08-18T13:01:21.347 回答
9

您可以做的另一件事是不要将您的密码/令牌存储在您的 settings.py 中,这是一种不好的安全做法,而不是那样,您应该在运行您的应用程序的用户中创建一个环境变量让我们说:

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 令牌和机密等)执行此操作,这样您就可以将配置与环境分开,而不必在测试服务器或本地环境中更改这些参数,您只需要确保您的环境变量相同,但根据您的环境指向正确的位置。

于 2013-08-18T13:38:43.437 回答