在 GitHub 上保护 Django 中的敏感信息
在 GitHub 上构建项目和软件并与全世界分享它们是一个有趣且令人兴奋的过程。我们喜欢为我们的应用程序添加令人兴奋和引人注目的功能,并使用 git 将代码推送到 GitHub。尽管如此,有时我们往往会忘记软件开发中最关键的方面之一:安全性。
在构建软件时,我们必须确保软件是安全的,并且没有潜在的数据泄露漏洞。
Web 框架 Django 具有强大的安全性。Django 的认证系统很强大。Django 有一个 settings.py
,其中存在大部分敏感数据。因此,将这样的文件存储在 GitHub 上可能是一个危险的决定。
不过别担心。有几种方法可以在 GitHub 上推送代码,同时确保安全。
使用环境变量保护 Django 中的敏感信息
环境变量是一些变量,其值存储在程序之外,从程序中读取它们以访问信息。这些变量存储在 .env
文件中。
首先,创建一个文件 .env
。然后,在 .gitignore
文件中,添加 .env
。此添加将确保 .env
文件不会上传到 GitHub。
现在你需要一个 Python 包来处理这些文件。包名称是 Decouple
。使用以下 pip
命令安装软件包。
pip install python-decouple
或者,
pip3 install python-decouple
在 .env
文件中,添加敏感信息。此信息可能是你的 Django 项目密钥、你的数据库凭据、你的电子邮件 ID 和密码、你的 API 密钥等。Decouple Python 包将自动在 Django 项目中查找此文件。
按以下方式存储信息。确保你遵循相同的语法:=
符号前后没有空格,也没有添加引号来表示字符串。
SECRET_KEY=abcdefghijklmnopqrstuvwxyz0123456789
DEBUG=True
DATABASE_NAME=HELLO_DJANGO
DATABASE_USERNAME=U_HELLO
DATABASE_PASSWORD=hA8(scA@!fg3*sc&xaGh&6%-l<._&xCf
DATABASE_HOST=127.0.0.1
DATABASE_PORT=127.0.0.1
WASD_API_KEY=abcdefghijklmnopqrstuvwxyz0123456789
PQRS_API_KEY=abcdefghijklmnopqrstuvwxyz0123456789
EMAIL=qwerty@wasd.com
PASSWORD=abcdefghijklmnopqrstuvwxyz0123456789
如上所述,我们通常并且应该将所有敏感数据保存在 settings.py
文件中。我们也会在这里做同样的事情,但我们不会直接添加值。我们将从我们刚刚创建的这个 .env
中读取它们。
在 settings.py
中,我们可以按如下方式检索上述值。
import os
from decouple import config
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = config('SECRET_KEY') # Here
DEBUG = config('DEBUG', cast = bool) # Here
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': config("DATABASE_NAME"), # Here
'USER': config("DATABASE_USERNAME"), # Here
'PASSWORD': config("DATABASE_PASSWORD"), # Here
'HOST': config("DATABASE_HOST"), # Here
'PORT': config("DATABASE_PORT", cast = int), # Here
}
}
WASD_API_KEY = config("WASD_API_KEY")
PQRS_API_KEY = config("PQRS_API_KEY")
EMAIL = config("EMAIL")
PASSWORD = config("PASSWORD")
config
有一个 cast
参数,用于定义值应该转换为哪种数据类型。默认情况下,Decouple 将所有值读取为字符串。因此,这个 cast
参数可用于将值转换为所需的数据类型。
就是这样。现在,所有敏感数据都保存在 .env
文件中,只要你不将此文件上传到 GitHub,信息就是安全的。此外,该项目也不会中断,因为变量在之前存在的地方完好无损。唯一改变的是我们给它们赋值的方式。