作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Arjaan Buijk's profile image

Arjaan Buijk

Arjaan是一名高级工程师和数据科学家,负责创建关键任务, 基于python的云解决方案专注于面向国际银行和保险公司的Rasa. 他设计并教授大规模Kubernetes解决方案.

Previously At

Rasa
Share

这是关于在基于django的项目中利用pydantic的系列文章的第4部分. 在我们继续之前,让我们回顾一下在本系列的第一部分中,我们重点介绍了pydantic对Python类型提示的使用 简化Django设置管理. In the second tutorial, 我们在基于这个概念构建web应用程序时使用了Docker, 使我们的开发和生产保持一致 environments. The third article described hosting our app on Heroku.

采用安全第一的设计原则编写——与Flask和FastAPI等Python库不同Django 特性支持识别许多常见的安全缺陷. 使用一个功能web应用程序示例, 运行并可在互联网上使用, 我们将利用Django来增强应用程序的安全性.

要继续学习,请确保首先部署我们的示例web应用程序,如 the first installment of this tutorial series. We will then assess, fortify, 并验证Django应用的安全性, 导致站点严格支持HTTPS.

步骤1:评估应用程序漏洞

One way to perform Django’s security check 站点验证顺序是导航到应用程序的根目录并运行:

python manage.py check——deploy——fail-level警告

但是这个命令已经包含在应用程序的 heroku-release.sh file (per the steps taken in part 3 在本教程系列中),并且该脚本在部署应用程序时自动运行.

The check 命令生成一个Django列表 security-related warnings, viewable by clicking the Show Release Log button in Heroku’s dashboard. 应用程序的输出如下所示:

系统检查发现了一些问题:
​
WARNINGS:
?: (security.W004)您没有为SECURE_HSTS_SECONDS设置值. 如果您的整个站点仅通过SSL提供服务, 您可能需要考虑设置一个值并启用HTTP严格传输安全. Be sure to read the documentation first; enabling HSTS carelessly can cause serious, irreversible problems.
?: (security.W008)您的SECURE_SSL_REDIRECT设置没有设置为True. 除非您的站点可以通过SSL和非SSL连接访问, 您可能希望将此设置设置为True或配置负载平衡器或反向代理服务器以将所有连接重定向到HTTPS.
?: (security.W012) SESSION_COOKIE_SECURE未设置为True. 使用仅安全的会话cookie使网络流量嗅探器更难以劫持用户会话.
?: (security.W016) You have 'django.middleware.csrf.CsrfViewMiddleware'在你的中间件中,但是你没有设置CSRF_COOKIE_SECURE为True. 使用仅安全的CSRF cookie使网络流量嗅探器更难以窃取CSRF令牌.​
系统检查发现4个问题(0个未解决).

重新解释一下,上述清单建议我们解决以下四个安全问题:

Item

Value (Requirement: Set to True)

Outcome

HSTS

SECURE_HSTS_SECONDS

启用HTTP严格传输安全.

HTTPS

SECURE_SSL_REDIRECT

Redirects all connections to HTTPS.

Session Cookie

SESSION_COOKIE_SECURE

Impedes user session hijacking.

CSRF Cookie

CSRF_COOKIE_SECURE

Hinders theft of the CSRF token.

我们现在将逐一解决所确定的四个问题. 我们的HSTS设置将考虑 (security.W004) 关于不小心启用HSTS以避免重大站点损坏的警告信息.

步骤2:加强Django应用程序的安全性

Before we address security concerns pertaining to HTTPS, 使用SSL协议的HTTP版本, 我们必须首先通过配置我们的web应用程序来接受SSL请求来启用HTTPS.

为了支持SSL请求,我们将设置配置变量 USE_SSL. 设置这个变量不会改变应用程序的行为, 但这是进一步修改配置的第一步.

让我们导航到Heroku仪表板的Settings选项卡的Config Vars部分, 在这里,我们可以查看我们配置的键值对:

Key

Value

ALLOWED_HOSTS

["hello-visitor.herokuapp.com"]

SECRET_KEY

Use the generated key value

DEBUG

False

DEBUG_TEMPLATES

False

按照惯例,Django的安全设置存储在 web app’s settings.py file. settings.py includes the SettingsFromEnvironment 类,该类负责环境变量. 让我们添加一个新的配置变量,将其键设置为 USE_SSL and its value to TRUE. SettingsFromEnvironment 将响应并处理这个变量.

While in our settings.py 文件中,让我们也更新HTTPS、会话cookie和CSRF cookie变量值. We will wait to enable HSTS,因为这需要额外的步骤.

支持SSL和更新这三个现有变量的关键编辑是:

类SettingsFromEnvironment (BaseSettings):
    USE_SSL: bool = False
​
try:
   # ...
    USE_SSL = config.USE_SSL

# ...
if not USE_SSL:
    SECURE_PROXY_SSL_HEADER = None
    SECURE_SSL_REDIRECT = False
    SESSION_COOKIE_SECURE = False
    CSRF_COOKIE_SECURE = False
else:
    # (security.W008)
    SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "http")
    SECURE_SSL_REDIRECT = True
    # (security.W012)
    SESSION_COOKIE_SECURE = True
    # (security.W016)
    CSRF_COOKIE_SECURE = True

这些Django安全更新对于保护我们的应用程序非常重要. 每个Django设置都有相应的安全警告标识符作为代码注释.

The SECURE_PROXY_SSL_HEADER and SECURE_SSL_REDIRECT 设置确保我们的应用程序只支持通过HTTPS连接到我们的网站, 这是一个比未加密的HTTP安全得多的选择. 我们的修改将确保试图通过HTTP连接到我们网站的浏览器被重定向到通过HTTPS连接.

为了支持HTTPS,我们需要提供SSL证书. Heroku’s 自动证书管理(ACM) 特性符合要求,并且默认情况下为Basic或Professional dynos设置.

With these settings added to the settings.py file, we can push our code changes, navigate to Heroku’s admin panel, 并从仓库中触发另一个应用程序部署,以在我们的站点上显示这些更改.

Step 3: Verify HTTPS Redirection

After deployment completes, 让我们检查我们网站上的HTTPS功能,并确认该网站:

  • Is directly accessible using the http:// prefix.
  • 属性时从HTTP重定向到HTTPS http:// prefix.

通过HTTPS重定向工作,我们已经解决了四个初始警告中的三个. 2, 3, and 4). 我们仍然需要解决的问题是HSTS.

Step 4: Enforce HSTS Policy

HTTP严格传输安全(HSTS)限制兼容的浏览器只能使用HTTPS连接到我们的网站. 第一次通过兼容的浏览器和HTTPS访问我们的站点时,HSTS将返回 a Strict-Transport-Security header response 阻止HTTP访问.

与特定于页面的标准HTTPS重定向相反, HSTS重定向适用于整个域. In other words, without HSTS support, 一个有一千页的网站可能会因为一千个HTTPS重定向请求而不堪重负.

Additionally, HSTS uses its own, 单独的缓存将保持完整, 即使用户清除了他们的“常规”缓存.

为了实现HSTS支持,让我们更新我们的应用程序 settings.py file:

 if not USE_SSL:
     SECURE_PROXY_SSL_HEADER = None
     SECURE_SSL_REDIRECT = False
     SESSION_COOKIE_SECURE = False
     CSRF_COOKIE_SECURE = False
+ SECURE_HSTS_INCLUDE_SUBDOMAINS = False
+    SECURE_HSTS_PRELOAD = False

然后跳到底部 else 在这之后加上这几行代码:

   # IMPORTANT:
   #(-)仅在确认HTTPS重定向工作后添加这些
   #
   # (security.W004)
   SECURE_HSTS_SECONDS = 3600 # 1小时
   SECURE_HSTS_INCLUDE_SUBDOMAINS = True
   SECURE_HSTS_PRELOAD = True

我们已经更新了三个设置以启用HSTS,如 Django documentation,并选择将我们的网站提交到浏览器预加载列表. You may recall that our (security.W004) 警告不要不小心启用HSTS. 为了避免与过早启用HSTS相关的任何事故,我们将值设置为 SECURE_HSTS_SECONDS to one hour; this is the amount of time your site would be broken if set up improperly. 我们将使用这个较小的值测试HSTS,以确认在增加服务器配置之前服务器配置是兼容的(常见选项是兼容的) 31536000 seconds, or one year.

现在我们已经实现了所有四个安全步骤, 我们的站点配备了HTTPS重定向逻辑和HSTS标头, 从而确保连接受到SSL增加的安全性的支持.

的设置逻辑编码的另一个好处是 USE_SSL 配置变量是指代码的单个实例 settings.py 文件)可以在我们的开发系统和生产服务器上工作.

Django Security for Peace of Mind

Safeguarding a site is no easy feat, 但是Django通过一些简单的, yet crucial, steps. Django开发平台使您能够相对轻松地保护站点, irrespective of whether you are a security expert or a novice. 我已经成功地在Heroku上部署了无数的Django应用程序,我晚上睡得很好,我的客户也一样.


Toptal Engineering博客向 Stephen Harris Davidson 为了检查和测试本文中提供的代码示例.

Understanding the basics

  • How do I secure my Django app?

    确保Django应用程序的安全需要两个重要的要素:正确使用和配置SSL证书,以及支持HTTP严格传输安全(HSTS)。.

  • Are Django apps secure?

    是的,当Django应用的网站和托管环境配置正确时,它是安全的. Django是根据基本的安全原则设计的.

  • 哪个Django应用程序是用来提供安全性的?

    Django提供了一个内置的安全检查器,它会突出显示它在应用程序中检测到的安全漏洞.

  • Django的缺点是什么?

    与其他互联网可用和托管应用程序一样, 如果不小心处理Django的安全性,它很容易受到恶意第三方的攻击.

  • Django应用程序最容易受到的漏洞有哪些?

    SSL证书的错误应用和HSTS的错误配置是两个常见问题,它们可能导致站点的数据和功能容易受到外部攻击者的攻击.

就这一主题咨询作者或专家.
Schedule a call
Arjaan Buijk's profile image
Arjaan Buijk

Located in Plymouth, MI, United States

Member since June 4, 2018

About the author

Arjaan是一名高级工程师和数据科学家,负责创建关键任务, 基于python的云解决方案专注于面向国际银行和保险公司的Rasa. 他设计并教授大规模Kubernetes解决方案.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Rasa

世界级的文章,每周发一次.

Subscription implies consent to our privacy policy

世界级的文章,每周发一次.

Subscription implies consent to our privacy policy

Toptal Developers

Join the Toptal® community.