配置安全响应头可以有效地防止客户端被入侵
检测网址#
介绍与配置#
HTTP 严格传输安全(HSTS)#
http 是明文传输,完全没有任何加密,这意味着任何人都可以从传输数据中获取浏览器到服务器间的所有内容。所以 https 使用的 TLS 加密十分值得推崇。然而,除非特殊指定 https,否则每次用域名访问时,都会首先向服务器发送 http 请求,再由服务器发送重定向到浏览器,接着浏览器才会升级为 https。
HSTS 就是解决这一问题的方法。
当浏览器接收到 https 站点发送的Strict-Transport-Security
头,浏览器便会遵守参数规定的时间执行 https 访问,当浏览器再次访问该站且未过规定时间时,浏览器便不会再发出 HTTP 请求,而是直接转用 https 连接,这防止了 SSL 剥离等针对尚未升级为 https 连接的攻击。
e.g.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
该头具有三个参数:max-age=63072000
、includeSubDomains
、preload
。
max-age=
表明保持 HTTPS 连接的时间,后跟秒数,如max-age=31536000
含义为一年内仅使用 https 连接includeSubDomains
表示该域名下所有子域名皆使用 https 访问
HSTS 很好,但最原始最开始的那次连接始终是 http,如果有个图谋已久的脚本小子渗透专家始终盯着一举一动,那该怎么办?
preload
参数便是用于解决这一问题。浏览器会从Chrome或Firefox预加载列表里获取应直接使用 https 连接的站点。该列表可在HSTSpreload主动提交
该列表可用chrome://net-internals/#hsts在本地 Chrome 上查询和删改
X-Frame-Options#
建议使用 CSP 参数代替
Content-Security-Policy
响应头有一个frame-ancestors
参数可以完美替代X-Frame-Options
响应头且具有更多特性
X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在
<frame>
、<iframe>
、<embed>
或者<object>
中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免点击劫持攻击。
e.g.
X-Frame-Options: SAMEORIGIN
该头仅有两个参数,SAMEORIGIN
和DENY
。
SAMEORIGIN
表明该页面只允许同源域名展示 frameDENY
表明完全不允许任何 frame
X-Content-Type-Options#
该头的主要作用是要求客户端严格遵守响应头Content-Type
中规定的文件MIME类型。否则浏览器会使用MIME-sniffing
猜测返回文件的内容并执行
如果该头没有被配置,那么隐藏在图片或其他媒体文件中的javascript
和css
就可能被攻击者利用来渗透系统
e.g.
X-Content-Type-Options: nosniff
该头仅有nosniff
一个参数来提示客户端
nosniff
将阻止请求与 MIME 类型不符的情况发生。
X-XSS-Protection#
浏览器兼容性
目前仅 Safari 浏览器仍支持
该头可被完全配置的 CSP 头取代
该头的作用和其名字一样一目了然,基于浏览器防护 XSS 攻击,因此不属于任何规范和草案中。
e.g.
X-XSS-Protection: 1; mode=block
该头有四个参数引用自 Mdn
-
0
禁止 XSS 过滤。 -
1
表明启用 XSS 过滤。如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。 -
1;mode=block
表明启用 XSS 过滤。如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。 -
1; report=<reporting-URI>
仅 chrome 4-77 版本支持。该参数表明启用 XSS 过滤。如果检测到跨站脚本攻击,浏览器将清除页面并使用 CSP report-uri 的功能发送违规报告。
Permissions Policy#
该头可用来控制页面可访问的浏览器功能,这可以让站点先一步为自身划定可能使用权限范围
e.g.
Permissions-Policy: geolocation=()
该头具有很多个参数,参数语法为<directive>=<allowlist>
,前半部分表示权限,后半部分表示允许的白名单。
权限列表
是否允许设置document.domain
是否允许使用加密媒体扩展 API (EME)
任务在未呈现时是否应在框架中执行
任务在可见视口之外时是否应在帧中执行
是否允许使用Element.requestFullscreen()
是否允许使用Gamepad API
是否允许使用Geolocation API
是否允许通过界面收集有关设备方向的信息
是否允许使用WebHID API
连接到不常见或奇异的人机界面设备,例如备用键盘或游戏手柄。
是否允许使用空闲检测 API 来检测用户何时与他们的设备交互
是否允许收集有关用户本地安装字体的数据
是否允许通过界面收集有关设备方向的信息
是否允许使用音频输入设备
是否允许使用 Web MIDI API
是否允许使用Payment Request API
是否允许通过相应的 API 以画中画模式播放视频。
是否允许使用Web Authentication API
来检索已存储的公钥凭据
是否允许使用屏幕唤醒锁定 API 来指示设备不应关闭或调暗屏幕
是否允许使用Web Serial API
与串行设备通信,通过串行端口直接连接,或通过 USB 或蓝牙设备模拟串行端口
是否允许使用音频输出设备 API 来列出和选择扬声器
是否允许使用Web USB API
是否允许使用Navigator.share()
, Web Share API 将文本、链接、图像和其他内容共享到用户选择的任意目的地,例如移动应用程序
是否允许使用 WebXR 设备 API 与 WebXR 会话进行交互
是否允许收集有关设备加速度信息
是否允许收集有关设备周围环境中的亮度信息
是否允许自动播放通过HTMLMediaElement
请求的媒体。
是否允许使用电池状态 API
是否允许使用视频输入设备
是否允许使用该getDisplayMedia()
方法捕获屏幕内容
白名单则具有三种值:
*
: 允许当前页面及所有呈现在页面中的内容使用该功能()
: 不允许使用该功能(self "https://example.org")
: 该种参数允许使用通配符,每个允许站点间以空格
隔开,self
表示本页面
内容安全策略(CSP)#
该头定义了哪些内容允许被该页面使用并执行。
CSP 配置很复杂,详情可以看看阮一峰老师的博客 Content Security Policy 入门教程
我可不想重造轮子绝不是因为懒得写
配置好 CSP 头后也可以使用 Google 提供的CSP Evaluator检测一下自己的 CSP 策略是否强力
跑分#
最上面的两个检测网址均可对响应头进行检测,Securityheaders 的检测没有 Mozilla 家的那么严苛,一般来讲检测如果能达到 A + 就表明安全性响应头配置得差不多了。