部署前的 Django Web 安全检查表 | 保护您的 Django 应用
wemake-django-模板
这篇文章与OnePublish交叉发布
你已经知道网络安全对于防止黑客和网络窃贼访问敏感信息至关重要。因此,在本文中,我们将检查 Django 的安全漏洞以及如何修复它们。
部署清单
首先,通过以下命令检查您的安全漏洞:
manage.py check --deploy
您可以看到一些描述,其中提供了有关您的 Django Web 应用程序漏洞的信息。请尝试在 Google 上搜索这些安全问题,并在投入生产之前修复它们。
Mozilla 天文台
如果您已部署应用程序,请使用Mozilla 的 Observatory网站扫描网站的安全状态。该网站还包含第三方扫描程序,用于测试网站的其他安全方面。
以下是扫描的示例:
跨站请求伪造(CSRF)保护
在 Web 应用中,Web 表单基本上会接收用户的输入,并将其发送到服务器端组件进行处理。服务器端组件通常将服务公开为 POST、PUT、DELETE 方法,用于通过 HTTP 接收数据。Django 内置了安全机制,可以抵御大多数形式的 CSRF 威胁,前提是您在必要时允许并启用了此功能。
如文档中所述,使用csrf_exempt装饰器标记视图时要非常小心,除非绝对必要。
如果有人可以访问(通过中间人攻击或 xss)您的 csrftoken cookie,那么这就是一个漏洞。
CSRF 保护无法防御中间人攻击,因此请使用具有 HTTP 严格传输安全性的HTTPS(我们将在后面的文章中讨论)。
设置 HTTPS 后,在settings.py中添加以下几行
CSRF_COOKIE_SECURE = True #to avoid transmitting the CSRF cookie over HTTP accidentally.
SESSION_COOKIE_SECURE = True #to avoid transmitting the session cookie over HTTP accidentally.
跨站点脚本(XSS)
跨站脚本 (XSS) 允许攻击者将脚本注入网站或应用程序的内容中。当用户访问受感染的页面时,该脚本将在受害者的浏览器中执行。这使得攻击者能够窃取 Cookie、帐户信息等隐私信息。
X-XSS-Protection:1;mode=block 启用 XSS 过滤。如果检测到攻击,浏览器将阻止页面渲染,而不是对页面进行清理。
要在 Django 中启用它,请确保 django.middleware.security.SecurityMiddleware 存在于中间件列表中,并在settings.py中添加以下几行:
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
Django 管理员安全
最重要的事情之一是确保 Django 管理的安全性。在部署应用程序之前,必须将admin/路径更改为只有您知道的路径。否则,其他人很容易在 URL 中输入 /admin 并访问管理员登录页面。
#urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls) # change admin something different
您可以使用django-admin-honeypot创建虚假的管理员登录页面,如果有人尝试未经授权的访问,它会通知您。
SSL重定向
将以下行添加到您的settings.py以强制 Django 将所有非 HTTPS 请求重定向到 HTTPS。
SECURE_SSL_REDIRECT = True
内容安全策略 (CSP)
如果您的 Django 应用程序很大,包含大量第三方代码,并且在整个项目中分散有大量内联脚本和样式,那么您应该将 CSP 添加到您的网站。
有关 CSP 的更多信息,请访问内容安全策略简介
Django 没有内置创建 CSP 标头的方法,因此您可以安装 Mozilla 的django-csp模块并使用浏览器的控制台来跟踪代码中的安全违规行为。
安装 django-csp 后,将以下几行添加到您的settings.py
# Content Security Policy
CSP_DEFAULT_SRC = ("'none'", )
CSP_STYLE_SRC = ("'self'", )
CSP_SCRIPT_SRC = ("'self'", )
CSP_IMG_SRC = ("'self'", )
CSP_FONT_SRC = ("'self'", )
所以,基本上,所有内联脚本和样式都将不再被允许。所有脚本和样式都必须从资源加载。您可以在脚本和样式的 CSP 标头中添加“unsafe-inline”,但这会破坏整个策略。
清理代码中所有内联样式和脚本非常重要。但是,某些外部资源(例如 Google Tag Manager 或 Google Analytics)应该在内容安全策略 (CSP) 中允许使用。为此,请按如下方式更新代码:
#Content Security Policy
CSP_DEFAULT_SRC = ("'none'", )
CSP_STYLE_SRC = ("'self'", "fonts.googleapis.com", "'sha256-/3kWSXHts8LrwfemLzY9W0tOv5I4eLIhrf0pT8cU0WI='")
CSP_SCRIPT_SRC = ("'self'", "ajax.googleapis.com", "www.googletagmanager.com", "www.google-analytics.com")
CSP_IMG_SRC = ("'self'", "data:", "www.googletagmanager.com", "www.google-analytics.com")
CSP_FONT_SRC = ("'self'", "fonts.gstatic.com")
CSP_CONNECT_SRC = ("'self'", )
CSP_OBJECT_SRC = ("'none'", )
CSP_BASE_URI = ("'none'", )
CSP_FRAME_ANCESTORS = ("'none'", )
CSP_FORM_ACTION = ("'self'", )
CSP_INCLUDE_NONCE_IN = ('script-src',)
更多信息请参阅django-csp 文档。
请注意,此配置取决于您正在使用的外部资源,因此请先阅读文档,然后将更改应用到您的网站。
HTTP 严格传输安全
设置此策略后,如果您未正确提供 HTTPS 资源,或者您的证书已过期,浏览器将在给定的时间段内拒绝连接到您的网站。
将以下几行添加到您的settings.py中:
SECURE_HSTS_SECONDS = 86400 # 1 day
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
任务完成!
现在你的应用几乎安全了。此外,你可以使用nmap扫描你的开放端口,并尝试在 Google 上搜索如何修复这些开放端口。
如果您喜欢这篇文章,请访问Reverse Python并与您的朋友分享!
文章来源:https://dev.to/thedevtimeline/django-web-security-checklist-before-deployment-secure-your-django-app-4jb8