我爱编程

可用的中间件

2018-03-26  本文已影响68人  大爷的二舅
缓存中间件

django.middleware.cache.UpdateCacheMiddleware; 和
django.middleware.cache.FetchFromCacheMiddleware

启用站点范围的缓存。 如果启用了这些功能,只要CACHE_MIDDLEWARE_SECONDS设置定义,每个Django驱动的页面都将被缓存。 请参阅缓存文档。

通用中间件

django.middleware.common.CommonMiddleware

为完美主义者增添了一些便利:

GZip中间件

django.middleware.gzip.GZipMiddleware

安全研究人员最近透露,当在网站上使用压缩技术(包括GZipMiddleware)时,该网站会受到一系列可能的攻击。 除其他外,这些方法可用于妥协Django的CSRF保护。 在您的网站上使用GZipMiddleware之前,您应该非常仔细地考虑您是否受到这些攻击。 如果您对是否受到影响有任何疑问,则应避免使用GZipMiddleware。 有关更多详细信息,请参阅breachattack.com。

压缩理解GZip压缩的浏览器的内容(所有现代浏览器)。

这个中间件应该放在任何其他需要读或写响应体的中间件之前,以便后来进行压缩。

如果满足以下任何条件,它将不压缩内容:

您可以使用gzip_page()修饰器将GZip压缩应用于各个视图。

有条件的GET中间件

django.middleware.http.ConditionalGetMiddleware

处理有条件的GET操作。 如果响应具有ETag或Last-Modified标头,并且请求具有If-None-Match或If-Modified-Since,则该响应将被替换为HttpResponseNotModified。

还设置Date和Content-Length响应头。

区域设置中间件

django.middleware.locale.LocaleMiddleware

根据请求中的数据启用语言选择。 它为每个用户定制内容。 请参阅国际化文档。

LocaleMiddleware.response_redirect_class默认为HttpResponseRedirect。 子类LocaleMiddleware并覆盖该属性以自定义由中间件发出的重定向。

消息中间件

django.contrib.messages.middleware.MessageMiddleware

启用基于cookie和会话的消息支持。 请参阅消息文档。

安全中间件

如果您的部署情况允许,让前端Web服务器执行SecurityMiddleware提供的功能通常是个好主意。 这样,如果存在不被Django提供服务的请求(例如静态媒体或用户上传的文件),它们将具有与对Django应用程序的请求相同的保护。

django.middleware.security.SecurityMiddleware为请求/响应周期提供了多项安全增强功能。 SecurityMiddleware通过将特殊标头传递给浏览器来实现这一点。 每个人都可以独立启用或禁用设置。

HTTP严格传输安全

设置:

对于只应通过HTTPS访问的网站,您可以通过设置Strict-Transport-Security标头,指示现代浏览器拒绝通过不安全连接(在给定的时间段内)连接到您的域名。这减少了您对某些SSL剥离中间人(MITM)攻击的暴露。

如果将SECURE_HSTS_SECONDS设置为非零整数值,SecurityMiddleware将为您在所有HTTPS响应中设置此标题。

启用HSTS时,首先使用小值进行测试是一个好主意,例如SECURE_HSTS_SECONDS = 3600一小时。每次Web浏览器从您的站点看到HSTS标头时,它都会拒绝在给定的时间段内与您的域进行非安全通信(使用HTTP)。

一旦您确认所有资产已在您的网站上安全使用(即HSTS没有破坏任何内容),最好增加此值以便不频繁的访问者受到保护(31536000秒,即1年是常见的)。

此外,如果将SECURE_HSTS_INCLUDE_SUBDOMAINS设置设置为True,SecurityMiddleware会将includeSubDomains标记添加到Strict-Transport-Security标头。建议这样做(假设所有子域都是使用HTTPS专门服务的),否则您的网站仍可能通过与子域的不安全连接而受到攻击。

HSTS策略适用于您的整个域,而不仅仅是您设置标题的响应的URL。 因此,只有在您的整个域名仅通过HTTPS提供服务时,您才应该使用它。浏览器正确地遵守HSTS标头将拒绝允许用户绕过警告并连接到具有过期,自签名或其他无效SSL证书的网站。 如果您使用HSTS,请确保您的证书状态良好并保持这种状态!

X-Content-Type-Options: nosniff

设置:

一些浏览器会尝试猜测他们获取的资产的内容类型,覆盖Content-Type标题。虽然这可以帮助显示配置不正确的服务器的网站,但它也可能带来安全风险。

如果您的网站提供用户上传的文件,恶意用户可以上传一个特制的文件,当您预期它是无害的时候,浏览器会将其解释为HTML或Javascript。

为了防止浏览器猜测内容类型并强制它始终使用Content-Type标头中提供的类型,可以传递X-Content-Type-Options:nosniff标头。如果SECURE_CONTENT_TYPE_NOSNIFF设置为True,SecurityMiddleware将为所有响应执行此操作。

请注意,在大多数部署情况下,Django不参与提供用户上传的文件,该设置不会对您有所帮助。例如,如果您的MEDIA_URL由您的前端Web服务器(nginx,Apache等)直接提供,那么您需要在此设置此标头。

另一方面,如果您使用Django来执行类似于需要授权的操作来下载文件,并且无法使用Web服务器设置标题,则此设置将非常有用。

X-XSS-Protection

设置:

某些浏览器可以阻止似乎是XSS攻击的内容。 他们通过在页面的GET或POST参数中查找Javascript内容来工作。 如果Javascript在服务器响应中重播,页面将被阻止呈现,并显示错误页面。

X-XSS-Protection头用于控制XSS过滤器的操作。

要在浏览器中启用XSS过滤器,并强制它始终阻止可疑的XSS攻击,可以通过X-XSS-Protection:1; mode =block头。 如果SECURE_BROWSER_XSS_FILTER设置为True,SecurityMiddleware将为所有响应执行此操作。

浏览器XSS过滤器是一种有用的防御措施,但不能完全依赖。 它无法检测到所有XSS攻击,并且并非所有浏览器都支持该头部。 确保您仍在验证所有输入以防止XSS攻击。

SSL 重定向

设置:

如果您的站点同时提供HTTP和HTTPS连接,则默认情况下,大多数用户最终将得到不安全的连接。为了获得最佳安全性,您应该将所有HTTP连接重定向到HTTPS。

如果将SECURE_SSL_REDIRECT设置为True,则SecurityMiddleware将永久(HTTP 301)将所有HTTP连接重定向到HTTPS。

出于性能原因,最好在Django以外的前端负载均衡器或反向代理服务器(如nginx)中执行这些重定向。 SECURE_SSL_REDIRECT适用于不适用的部署情况。

如果SECURE_SSL_HOST设置具有值,则所有重定向都将发送到该主机,而不是原始请求的主机。

如果网站上有几个页面应该可通过HTTP访问,并且未重定向到HTTPS,则可以列出正则表达式以匹配SECURE_REDIRECT_EXEMPT设置中的这些URL。

如果您部署在负载平衡器或反向代理服务器后面,并且Django似乎无法确定请求实际上已经安全,您可能需要设置SECURE_PROXY_SSL_HEADER设置。

会话中间件

django.contrib.sessions.middleware.SessionMiddleware

启用会话支持。 有关更多信息,请参阅第15章。

网站中间件

django.contrib.sites.middleware.CurrentSiteMiddleware

添加该网站
属性表示当前站点到每个传入的HttpRequest对象。 有关更多信息,请参阅网站文档

身份验证中间件

django.contrib.auth.middleware提供了三种用于身份验证的中间件:

有关Django中用户认证的更多信息,请参阅第11章。

CSRF保护中间件
django.middleware.csrf.CsrfViewMiddleware

通过向POST表单添加隐藏的表单字段并检查请求以获取正确的值,添加对跨站请求伪造(CSRF)的保护。 有关CSRF保护的更多信息,请参阅第19章。

X-Frame-Options中间件

django.middleware.clickjacking.XFrameOptionsMiddleware

通过X-Frame-Options标头实现简单的点击劫持保护。

中间件订购

表17-1提供了有关各种Django中间件类的排序的一些提示:

表17-1:中间件类的排序

说明
UpdateCacheMiddleware 在那些修改Vary头部之前(SessionMiddleware,GZipMiddleware,LocaleMiddleware)。
GZipMiddleware 在任何可能改变或使用响应主体的中间件之前。 UpdateCacheMiddleware之后:修改Vary标题。
ConditionalGetMiddleware CommonMiddleware之前:当USE_ETAGS = True时使用它的Etag标头。
SessionMiddleware UpdateCacheMiddleware之后:修改Vary标题。
LocaleMiddleware 在SessionMiddleware(使用会话数据)和CacheMiddleware(修改Vary头)之后的最顶层之一。
CommonMiddleware 在任何可能改变响应的中间件之前(它计算ETags)。 在GZipMiddleware之后,它不会计算gzip内容上的ETag标头。 靠近顶部:APPEND_SLASH或PREPEND_WWW设置为True时重定向。
CsrfViewMiddleware 在任何认为CSRF攻击已被处理的中间件之前。
AuthenticationMiddleware SessionMiddleware之后:使用会话存储。
MessageMiddleware SessionMiddleware之后:可以使用基于会话的存储。
FetchFromCacheMiddleware 在修改Vary头的任何中间件之后:该头用于为缓存散列键选择一个值。
FlatpageFallbackMiddleware 应该接近底部,因为它是最后一种类型的中间件。
RedirectFallbackMiddleware 应该接近底部,因为它是最后一种类型的中间件。
下一步是什么?

在下一章中,我们将讨论Django的国际化。

上一篇下一篇

猜你喜欢

热点阅读