在部署Django项目时保护敏感信息
在我们的Django项目中,会有很多敏感信息驻留在settings.py中,或包含敏感信息的本地变量,或使用表单的POST请求中。因此,在部署Django项目时,我们必须确保它们受到保护,尤其是那些公开可用的存储库。当一个项目在没有处理所有可能的测试案例的情况下被部署,并且使用DEBUG=True,那么对于黑客来说,寻找漏洞的工作就是小菜一碟了。因此,用户的数据可能会因为忽略了在settings.py文件中保护敏感信息的重要性而被暴露。有很多情况下,主要在公共资源库中暴露敏感信息可能会出现问题。
处理settings.py文件
为了保护settings.py文件中的敏感信息,我们将使用Python-decouple库。这个库有助于将设置参数从源代码中分离出来。与项目有关的参数进入源代码,与项目实例有关的参数进入环境文件。
安装
要安装这个模块,在终端键入以下命令。
pip install python-decouple
一步一步实现
- 在manage.py文件附近创建一个.env文件来存储敏感数据,如下图所示。
创建.env文件后,它看起来像。
- 现在我们将从settings.py文件中复制敏感信息,如秘钥、调试、数据库用户、数据库名称、数据库密码、数据库主机值,并将其粘贴到创建的.env文件中,如。
- 现在去settings.py文件,添加这一行来导入之前安装的decouple。
from decouple import config
- 用config替换settings.py文件中的秘钥,在config中输入你在.env文件中保存秘钥的变量。
SECRET_KEY = config('SECRET_KEY')
- 同样,将debug值替换为:
DEBUG = config('DEBUG')
- 类似地替换DB_USER,DB_NAME,DB_PASSWORD,DB_HOST。
- 现在保存所有的文件。
- 然后在.env文件旁边创建一个.gitignore文件,如下所示。
- 然后在.gitignore文件内输入.env,保存并关闭该文件。
- 现在你可以把这些文件添加到git上,并安全地推送它们。
处理敏感的变量
敏感变量是指包含密码、用户名等信息的变量。为了保护这些信息不被显示在错误报告中,我们可以使用django.view.decorators.debug模块中的ensitive_variables装饰器。
示例:
from django.views.decorators.debug import sensitive_variables
@sensitive_variables('password', 'acc', 'name')
def fun():
password = user.password
acc = user.account_no
name = user.name
我们也可以通过不向sensitive_variables装饰器提供任何参数来隐藏所有的局部变量,以避免它们显示在错误报告中。
示例:
from django.views.decorators.debug import sensitive_variables
@sensitive_variables()
def fun():
password = user.password
acc = user.account_no
name = user.name
处理POST参数
假设其中一个POST请求包含敏感信息,如密码、账号、信用卡号等。我们也希望避免这些信息显示在错误报告中。Django在django.view.decorators.debug模块中提供了ensitive_post_parameters装饰器来处理这个问题。
示例:
from django.views.decorators.debug import sensitive_post_parameters
@sensitive_post_parameters('name', 'password', 'acc')
def fun(request):
name = request.POST['name']
password = request.POST['password']
acc = request.POST['account_no']
我们也可以通过不向sensitive_post_parameters装饰器提供任何参数来隐藏所有的帖子参数。
示例:
from django.views.decorators.debug import sensitive_post_parameters
@sensitive_post_parameters()
def fun(request):
name = request.POST['name']
password = request.POST['password']
acc = request.POST['account_no']