Table of Contents

X-XSS-Protection

HTTP X-XSS-Protection 响应头是Internet Explorer,Chrome和Safari的一个功能,
当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。虽然这些保护在现代浏览器中基本上是不必要的,
当网站实施一个强大的Content-Security-Policy来禁用内联的JavaScript ('unsafe-inline')时, 
他们仍然可以为尚不支持 CSP 的旧版浏览器的用户提供保护。

语法
X-XSS-Protection: 0    //禁止XSS过滤。

X-XSS-Protection: 1   
//启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。

X-XSS-Protection: 1; mode=block  
//启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。

X-XSS-Protection: 1; report=<reporting-uri>
启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。

F.Y.I.: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection

X-Frame-Options

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, 
<iframe> 或者 <object> 中展现的标记。网站可以使用此功能,
来确保自己网站的内容没有被嵌到别人的网站中去,
也从而避免了点击劫持 (clickjacking) 的攻击。

X-Frame-Options 有三个值:
DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri  表示该页面可以在指定来源的 frame 中展示。

换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,
在同域名页面中同样会无法加载。另一方面,
如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。

F.Y.I. https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

X-Content-Type-Options

X-Content-Type-Options 响应首部相当于一个提示标志,
被服务器用来提示客户端一定要遵循在 Content-Type 首部中对  MIME 类型 的设定,
而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,
也就是意味着网站管理员确定自己的设置没有问题。

语法: X-Content-Type-Options: nosniff

F.Y.I. https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Content-Type-Options

Strict-Transport-Security

HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,
它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式.

开启HSTS只需要当通过HTTPS方式访问你的网站时,返回 Strict-Transport-Security HTTP 头信息:

Strict-Transport-Security: max-age=expireTime [; includeSubdomains]

expireTime 过期时间,单位秒,浏览器需要记住这个网站只能通过HTTPS访问的时间。
includeSubdomains 可选: 如果这个可选的参数定义了,这条规则对于网站的所有子域同样生效。

F.Y.I. https://developer.mozilla.org/zh-CN/docs/Security/HTTP_Strict_Transport_Security

Content-Security-Policy

有如下指令:

default-src 实例 解释
default-src 'self' cdn.example.com 默认策略,也就是说你把这个设置了成 'self' 就让其他没有设置的都遵循这个 'self'策略
script-src 'self' js.example.com 定义js文件的过滤策略
style-src 'self' css.example.com 定义css文件的过滤策略
img-src 'self' img.example.com 定义图片文件的过滤策略
connect-src 'self' https: 定义请求连接文件的过滤策略
font-src font.example.com 定义字体文件的过滤策略
object-src 'self' 定义页面插件的过滤策略,如 <object>, <embed> 或者<applet>等元素
media-src media.example.com 定义媒体的过滤策略,如 HTML6的 <audio>, <video>等元素
frame-src 'self' 定义加载子frmae的策略
report-uri /some-report-uri 设置需要通知时的地址

对应的值:

实例 解释
'self' script-src 'self' 同源策略,即允许同域名同端口下,同协议下的请求
data: img-src 'self' data: 允许通过data来请求资源 (比如用Base64 编码过的图片)
* img-src * 允许任意地址的url,但是不包括 blob: filesystem: schemes
'none' object-src 'none' 所有地址的资源都不允许加载
domain.example.com img-src domain.example.com 允许特定的域名请求资源
*.example.com img-src *.example.com 允许从 example.com下的任意子域名加载资源
https://cdn.com img-src https://cdn.com 仅仅允许通过https协议来从指定域名下加载资源
https: 或者 http: img-src https: 只允许通过https协议加载资源
'unsafe-inline' script-src 'unsafe-inline' 允许行内代码执行
'unsafe-eval' script-src 'unsafe-eval' 允许不安全的动态代码执行,比如 JavaScript的 eval()方法

行内代码:

比如:<script>console.log("foo");</script>
或者 <div onclick="console.log('click')">Click me!</div>

eval()及相关的

eval("console.log('some output');");

window.setTimeout("alert('Hello World!');", 500);

var f = new Function("console.log('foo');");

 

F.Y.I.