Django,安全和设置

时间:2017-02-06 21:26:21

标签: python django security encryption

here,我们将所有数据库信息添加为文本:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql',
    'NAME': 'mydatabase',
    'USER': 'mydatabaseuser',
    'PASSWORD': 'mypassword',
    'HOST': '127.0.0.1',
    'PORT': '5432',
    }
 }

这是一种安全的方式吗?有没有办法将这些数据保存为加密数据?

3 个答案:

答案 0 :(得分:5)

它不安全,任何有权访问您的源代码管理的人现在都可以访问您的数据库。

存储敏感数据的两种主要方法是使用环境变量或通过json文件

  

摘自Settings - Hiding secret data using a JSON file。原作者是Antoine Pinsardfredley。归因详情可在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'),
    },
}

致谢:Two Scoops of Django: Best Practices for Django 1.8, by Daniel Roy Greenfeld and Audrey RoyGreenfeld. Copyright 2015 Two Scoops Press (ISBN 978-0981467344)

  

摘自Settings - Using Environment variables to manage Settings across servers。原作者是sudshekharssiceNBajanca。归因详情可在contributor page上找到。该来源在CC BY-SA 3.0下获得许可,可以在Documentation archive中找到。参考主题ID:942和示例ID:3580。

使用环境变量管理跨服务器的设置

使用环境变量是一种广泛使用的方法,可根据环境设置应用程序的配置,如The Twelve-Factor App中所述。

由于配置可能会在部署环境之间发生变化,因此这是一种非常有趣的方式来修改配置,而无需深入挖掘应用程序的源代码,并将秘密保存在应用程序文件和源代码存储库之外。

在Django中,主要设置位于项目文件夹中的settings.py。由于它是一个简单的Python文件,您可以使用标准库中的Python os模块来访问环境(甚至具有适当的默认值)。

settings.py

    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

祝你好运。