我爱编程

Django中的SSL / HTTPS

2018-04-03  本文已影响149人  大爷的二舅

在所有情况下,安全性总是更好,但在HTTPS后部署您的站点并不总是可行。 否则,恶意网络用户可能会嗅探身份验证凭证或客户端与服务器之间传输的任何其他信息,并且在某些情况下(主动网络攻击者)可能会更改以任一方向发送的数据。

如果您需要HTTPS提供的保护,并且已在服务器上启用它,则还需要执行一些额外的步骤:

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,请确保您的证书状态良好并保持这种状态

如果您部署在负载平衡器或反向代理服务器后面,并且Strict-Transport-Security头没有添加到您的响应中,可能是因为Django没有意识到它处于安全连接中; 您可能需要设置SECURE_PROXY_SSL_HEADER设置。

主机头验证

在某些情况下,Django使用客户端提供的Host头来构造URL。 尽管这些值已经过清理以防止跨站点脚本攻击,但可以将虚假主机值用于跨站点请求伪造,缓存中毒攻击以及邮件中的中毒链接。

因为即使看起来很安全的Web服务器配置也容易受到虚假主机头的影响,Django会根据django.http.HttpRequest.get_host()方法中的ALLOWED_HOSTS设置验证主机头。

这个验证只适用于get_host(); 如果您的代码直接从request.META访问主机头,则您将绕过此安全保护。

会话安全

与CSRF限制类似,要求部署网站以使不受信任的用户无权访问任何子域,django.contrib.sessions也具有限制。 有关详细信息,请参阅会话主题指南中的安全性部分

用户上传的内容
上一篇下一篇

猜你喜欢

热点阅读