在 Django 项目中添加 CSP 标头
在开发网站和 Web 应用程序时,网站安全一直是一个重要因素。许多框架都有自己的安全策略,开发人员在开发应用程序时也尝试实现最多的安全策略。即使经过这么多的努力,黑客仍然会找到新的方法来渗透到我们的应用程序中,利用我们的代码找到漏洞。在本文中,我们将实现一个安全标头,通常称为 Django 应用程序的 CSP 标头。
术语
- CSP :Content-Security-Policy 是一个 HTTP 响应标头,现代浏览器使用它来增强网页的安全性,它允许您限制诸如 JavaScript、CSS 或几乎任何浏览器加载的资源的方式。
- HTTP 标头:HTTP 标头让客户端和服务器通过 HTTP 请求或响应传递附加信息,例如 MIME 类型、请求状态代码、cookie 和代理信息等
- XSS : 也缩写为 Cross Side Scripting,XSS 攻击使攻击者能够将客户端脚本注入到其他用户查看的网页中,如果被利用可以改变网页的外观和行为。
- Django: django 是一个基于Python的 Web 应用程序框架,用于构建各种 Web 应用程序
什么是内容安全策略?
Content-Security-Policy是现代浏览器用来增强网页安全性的 HTTP 响应标头,它允许您限制诸如 JavaScript、CSS 或浏览器加载的几乎任何旨在防止 XSS 攻击的资源的方式。攻击者将客户端脚本以简单的语言注入其他用户查看的网页中,如果被利用,可以改变网页的外观和行为。它也被称为 X-Content-Security-Policy 或 X-Webkit-CSP 标头的继承者。 CSP 也可以使用元标记来实现。
一些 CSP 标头术语是
- default-src :加载所有内容的默认源
- style-src : 加载样式的源
- script-src : 加载 javascript 或一般脚本的源代码
- img-src : 加载图片的源
- object-src : 加载媒体的源
- report-to : uri 发送违反 CSP 的报告
- 'self':从同一主机加载
- 'unsafe-inline' : 允许内联样式和脚本
- 'unsafe-eval' :允许使用 eval() 和类似的方法从字符串创建代码
- 'nonce' :一个随机字符串,每个请求应该是唯一的
内容安全策略如何运作?
CSP 的工作原理是阻止样式、脚本和其他内容的执行,除非它们在策略中被允许。 CSP 不允许执行内联脚本和样式,这意味着我们不能将 和 标签用于 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 的样式表引导程序样式的 cdn。我们还允许使用通配符子域从所有 Cloudflare 子域加载脚本,并且浏览器可以允许从 imgur.com 加载脚本。除此之外,如果网页尝试从其他域(如 twitter)加载,浏览器将阻止请求。
在 Django 中实现 CSP 标头
Django 的核心并没有附带 CSP 头文件,但多亏了 Mozilla,他们创建了一个包 django-csp 来添加 CSP 头文件。
# installing django-csp
pip3 install django-csp
在 django 项目的 setting.py 文件中将 CSP 添加到中间件,然后我们将配置我们的头文件
Python3
MIDDLEWARE = (
# ...
'csp.middleware.CSPMiddleware',
# ...
)
Python3
# uri to report policy violations
# uri to report policy violations
CSP_REPORT_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'", )
配置 CSP 标头
转到django项目的设置文件,在最后或者任何你想要的地方添加以下内容
蟒蛇3
# uri to report policy violations
# uri to report policy violations
CSP_REPORT_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 Header 设置的说明
以下是在您的 Web 应用程序中完美实施 CSP 的一些说明
- 尽量避免添加不必要的主机名
- 添加或删除主机名时尽可能多地检查
- 在绝对必要之前不要添加'unsafe-inline',它会削弱我们的安全策略
- 尽量避免内联样式和脚本
- 最好从一开始就不要在开发服务器中使用 CSP
- 在加载脚本、样式、图像时始终尝试使用 HTTPS。