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
S3_BUCKET_KEY = 'xxxxxxxxxxxxxxxx'
Don’t
S3_BUCKET = 'xxxxxxxxxxxxxxxx'
CHAVE_DE_ACESSO = 'xxxxxxxxxxxxxxxx'  # "access key" in portuguese

 

即使在使用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):
    ...

 

进一步阅读

在Django官方文档中阅读有关过滤敏感信息的更多信息

 

发表评论