在Django项目中添加CSP头文件

在Django项目中添加CSP头文件

在开发网站和网络应用程序时,网站安全一直是一个重要因素。许多框架都有自己的安全策略,开发人员在开发他们的应用程序时也试图实施最大的安全策略。但是,即使在这么多努力工作之后,黑客仍然会找到新的方法来渗透到我们的应用程序中,利用我们的代码漏洞。在这篇文章中,我们将在Django应用程序中实现一个安全头,通常被称为CSP头。

Terminology

  • CSP:Content-Security-Policy是一个HTTP响应头,现代浏览器使用它来加强网页的安全性,允许你限制诸如JavaScript、CSS或几乎所有浏览器加载的资源。
  • HTTP标头:HTTP头让客户端和服务器在HTTP请求或响应中传递额外的信息,如MIME类型、请求状态代码、cookie和代理信息,以及更多。
  • XSS:也被缩写为交叉脚本,XSS攻击使攻击者能够将客户端脚本注入到其他用户浏览的网页中,简单地说,如果被利用,可以改变网页的外观和行为。
  • Django。Django是一个基于python的网络应用程序框架,用于构建各种网络应用程序。

什么是内容安全政策?

Content-Security-Policy i是一个HTTP响应头,现代浏览器使用它来加强网页的安全性,允许你限制资源,如JavaScriptCSS,或几乎所有浏览器加载的东西,以防止XSS攻击,这使得攻击者能够将客户端脚本注入其他用户查看的网页,简单地说,如果利用它可以改变网页的外观和行为。它也被称为X-Content-Security-Policy或X-Webkit-CSP头文件的继承者。CSP也可以使用元标签来实现。

一些CSP头的术语是

  • default-src:加载所有内容的默认源。
  • style-src:加载样式的来源
  • script-src: 加载javascript或一般脚本的来源
  • img-src: 加载图片的来源
  • object-src: 加载媒体的来源
  • report-to:用于发送违反CSP的报告的URI
  • ‘self’: 从同一主机加载
  • ‘unsafe-inline’:允许内联样式和脚本。
  • unsafe-eval”:允许eval()和类似的方法从字符串创建代码。
  • nonce’: 一个随机字符串,每个请求都应该是唯一的。

内容安全政策是如何运作的?

CSP的工作原理是阻止样式、脚本和其他东西的执行,除非它们在策略中被允许。CSP不允许执行内联脚本和样式,这意味着我们不能使用<script/> 和<style/>标签来进行javascript和样式设计。

CSP头文件的一个例子是

Content-Security-Policy: default-src 'self';
style-src: 'self' stakpath.bootstrapcdn.com;
script 'self' *.cloudflare.com;
img-src 'self' imgur.com;

在这个 CSP 头中,我们告诉浏览器,所有样式、脚本、图像和对象的默认来源应该是头中传递的域,同时我们还允许样式表来自 stackpath.bootstrapcdn.com,这是 Bootstrap 样式的 CDN。我们还允许使用通配符子域从所有 Cloudflare 子域加载脚本,对于图片,浏览器可以允许从 imgur.com 加载。除此以外,如果网页试图从其他域(如twitter)加载,浏览器会阻止这些请求。

在Django中实现CSP头文件

Django的核心部分并没有配备CSP头文件,但感谢Mozilla,他们创建了一个Django-CSP包来添加CSP头文件。

# installing django-csp
pip3 install django-csp

在Django项目的setting.py文件中把CSP添加到中间件中,然后我们将配置我们的头文件

MIDDLEWARE = (
    # ...
    'csp.middleware.CSPMiddleware',
    # ...
)

配置CSP头文件

进入Django项目的设置文件,在最后一个或任何你想要的地方添加以下内容

# uri to report policy violations
# uri to report policy violations
CSP_REPORT_URI = '<add your reporting uri>'
  
# default source as self
CSP_DEFAULT_SRC = ("'self'", )
  
# style from our domain and bootstrapcdn
CSP_STYLE_SRC = ("'self'", 
    "stackpath.bootstrapcdn.com")
  
# scripts from our domain and other domains
CSP_SCRIPT_SRC = ("'self'",
    "ajax.cloudflare.com",
    "static.cloudflareinsights.com",
    "www.google-analytics.com",
    "ssl.google-analytics.com",
    "cdn.ampproject.org",
    "www.googletagservices.com",
    "pagead2.googlesyndication.com")
  
# images from our domain and other domains
CSP_IMG_SRC = ("'self'",
    "www.google-analytics.com",
    "raw.githubusercontent.com",
    "googleads.g.doubleclick.net")
  
# loading manifest, workers, frames, etc
CSP_FONT_SRC = ("'self'", )
CSP_CONNECT_SRC = ("'self'", 
    "www.google-analytics.com" )
CSP_OBJECT_SRC = ("'self'", )
CSP_BASE_URI = ("'self'", )
CSP_FRAME_ANCESTORS = ("'self'", )
CSP_FORM_ACTION = ("'self'", )
CSP_INCLUDE_NONCE_IN = ('script-src', )
CSP_MANIFEST_SRC = ("'self'", )
CSP_WORKER_SRC = ("'self'", )
CSP_MEDIA_SRC = ("'self'", )

你可以根据你的需要添加所需的主机名

在Django项目中添加CSP头的设置说明

以下是在你的网络应用中完美实现CSP的一些说明

  • 尽量避免添加不必要的主机名
  • 在添加或删除主机名时尽可能多地进行检查
  • 除非有必要,否则不要添加 “无安全内联”,这将削弱我们的安全策略。
  • 尽量避免内联样式和脚本
  • 最好不要一开始就在开发服务器中使用CSP
  • 在加载脚本、样式、图像时,总是尝试使用HTTPS。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程