Django技巧# 保护敏感信息
互联网是一片荒野。在internet上部署web应用程序时,安全性必须是第一位的。Django框架提供了可靠和安全的api,这是一项了不起的工作。
我们永远不要使用DEBUG=True
来部署Django应用程序,DEBUG=True的一个特性是从环境中转储大量元数据,包括设置.py配置,当发生异常时包括整个 settings.py配置可能会泄露。
即使您永远不会使用DEBUG=True
,在命名settings.py模块中的配置 时也需要格外小心。确保所有敏感变量都使用以下关键字之一:
- API
- KEY
- PASS
- SECRET
- SIGNATURE
- TOKEN
这样,Django就不会转储那些可能包含敏感信息的变量。
Do
Don’t
即使在使用DEBUG=False运行应用程序时,如果将其配置为通过电子邮件发送错误报告,也有可能会公开错误报告,特别是在通过internet未加密传输错误报告时。
注:不要将敏感信息提交给公共存储库。换句话说,不要将敏感信息直接添加到settings.py文件,而是使用环境变量或使用python-decouple。进一步了解如何将配置与代码分离阅读我不久前发表的这篇文章:packageoftheweek:Python Decouple。
说到过滤错误报告,有两个视图装饰器应该投入使用:
sensitive_variables
如果您的代码处理视图函数内部局部变量中的敏感信息,请显式将其标记为敏感信息以避免在错误报告中显示它们:
from django.views.decorators.debug import sensitive_variables @sensitive_variables('user', 'pw', 'cc') def process_info(user): pw = user.pass_word cc = user.credit_card_number name = user.name ...
或者,如果您想隐藏函数内的所有局部变量:
@sensitive_variables() def my_function(): ...
PS:使用多个装饰器时,请确保@sensitive_variables()
装饰器是第一个。
sensitive_post_parameters
类似于上一个示例,但该示例处理post参数,顾名思义:
from django.views.decorators.debug import sensitive_post_parameters @sensitive_post_parameters('pass_word', 'credit_card_number') def record_user_profile(request): UserProfile.create( user=request.user, password=request.POST['pass_word'], credit_card=request.POST['credit_card_number'], name=request.POST['name'], ) ...
以类似的方式,隐藏所有发布参数:
@sensitive_post_parameters() def my_view(request): ...
进一步阅读