Web 是一个不断发展的渠道,有许多向后兼容的问题。 新的 web 安全实践一般来自于对存在缺点的旧功用的知道。 与其经过改动这些功用来损坏旧网站,还不如挑选参加一些更安全的设置。 你能够经过设置 HTTP 头来完成这一点。
Securityheaders.com 是一个由安全参谋 Scott Helme 运转的东西,它能够在这些安全头上创立一个陈述。 它为任何 URL 供给从 F 到 A+ 的评分,这是一种衡量网站安全情况的简略办法。 可是,像任何自动化陈述相同,它需求人工解说陈述的上下文。
(我也引荐 Mozilla Observatory 安全扫描器,但我不会在这里运用它,因为它的功用远远超过了安全头。)
举个比方,Yahoo在 securityheaders.com 上的得分是 A+ :
一起(在写这篇文章的时分) Google 的得分是 C:
本文是一个关于怎么装备一个典型的 Django web 应用程序来取得 A+ 得分的攻略。 你能够打败谷歌,维护你的用户,给你的老板、客户或同伴留下深刻印象!
咱们将检查你需求设置的6个 HTTP 安全头信息来取得 A+ (在编撰本文时)分数。 别的,咱们还会供给一个额定的实验性的第7个安全头…
1. X-XSS-Protection
跨站点脚本进犯或 XSS 是一种进犯者能够用来将他们自己的代码注入到你的网站的跨站脚本。 这可能会做一些歹意的作业,比方增加虚伪内容或许监督你的用户盗取他们的暗码。
因为 XSS 是网站上常见的一种缺点,浏览器在某些情况下增加了检测和避免这种缝隙进犯的功用,并捆绑在"XSS Auditors"中。 默许情况下,这些安全功用都是启用的,所以看起来像 XSS 进犯的一些脚本会被阻挠,可是页面会持续作业。
将X-XSS-Protection HTTP 头设置为运用"块形式"以供给额定的安全性。 这告知浏览器彻底屏蔽被检测到的 XSS 进犯的页面,以防它们包含其他欠好的东西。 例如,请拜见 Scott Helme 的演示,其间 HTML 发送了一个 GET 参数并出现在被堵塞的页面上。
这供给了一点额定的维护,增加这个HTTP头是一个好主意。 即便你的网站能够防护 XSS 进犯,假如它触发浏览器的 XSS auditor,进犯行为会被重构,以避免持续运用缝隙。
Django 内置了这个HTTP头,而且很简略激活。假如你没有设置该HTTP头,那么你在运转 manage.py check –deploy 时,会看到 security.W007正告。
启用阐明:
·你需求在你的MIDDLEWARE中设置django.middleware.security.SecurityMiddleware ,值设置的越高越好。 在默许情况下Django现已为你完成了startproject模板
·在你的设置文件中增加 SECURE_BROWSER_XSS_FILTER = True
请参阅 Django 文档中的更多内容,例如关于媒体文件的阐明。
2. Strict-Transport-Security
HTTP Strict Transport Security 或 HSTS,是一种告知浏览器只能经过 HTTPS 加载你的网站的 HTTP严厉传输安全计划。 一旦浏览器在一个网站上看到了标题,它就只会向该网站宣布 HTTPS 恳求。 该HTTP头包含一个以秒为单位的更大运用时刻,这约束了浏览器回忆此操作的时刻。 这能够避免中间人进犯或许 AITM 阻拦 HTTP 恳求并将歹意的内容注入你的网页中。
一般来说主张为Strict-Transport-Security HTTP头设置一个 max-age 值。 除此之外,你还能够设置下面几个标志:
·includeSubDomains 包含你的域名的一切子域名
·preload 告知浏览器将你的域名存储在已知的只要 strict 域的数据库中。 它只能设置在尖端域名上,如example.com。在 HSTS 预加载的域名上翻开 URL 的浏览器将 永久不能够使AITM 进犯支撑 HTTP 恳求
·一旦设置了这个标志,你就能够经过谷歌的预装载服务将你的域名提交到一切浏览器。在承受你的域名之后,每个浏览器的下一个版别将包含你的域名。
最近有一些 TLD,如.app 完成了本身的预加载,这意味着这些 TLD 只支撑 HTTPS 站点。 超级安全。
相同,这个头部是 Django 内置的。 假如你没有设置 max-age 值你会看到 security.W004正告。假如你没有设置 includeSubDomains 标志 则会看到 security.W005正告,相同,假如你未设置 preload 标志,那么你将看到security.W021正告。
启用阐明:
·SecurityMiddleware 的装置和设置同上
·将 SECURE_HSTS_SECONDS 设置为你想在头部指定的秒数
·(可选)设置SECURE_HSTS_INCLUDE_SUBDOMAINS 及SECURE_HSTS_PRELOAD 为True 激活他们各自的标志
这不是你能够简略启用的东西,特别是假如其他子域正在运用这些选项的话! 只要当你具有一个全新的域名时,它才会变得简略明了。 Django 的 security.W004 甚至有如下阐明:[1][2][3]黑客接单网