HTTP安全请求头 --- 可能绕waf的姿势

X-XSS-Protection

功能

跨站脚本,通常缩写为XSS就是攻击者导致页面加载一些恶意的JavaScript攻击.X-XSS-Protection

在Chrome和Inter Explorer的中旨在防止反射型XSS攻击者发送包含恶意代码的请求攻击。

X-XSS-Protection: 0; (关闭XSS过滤)
X-XSS-Protection: 1; (启用XSS过滤,如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分))
X-XSS-Protection: 1; mode=block  (启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载)
1; report=<reporting-URI>  (Chromium only) (启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告)
使用方法
平台 使用方法
Rails4,5 使用默认即可
Django 使用SECURE_BROWSER_XSS_FILTER = True
Express.js 使用helmet
go 使用unrolled/secure
Nginx add_header X-XSS-Protection "1; mode=block";
Apache Header always set X-XSS-Protection "1; mode=block"
Varnish set resp.http.X-XSS-Protection = "1; mode=block";
浏览器兼容性
  1. PC版

    浏览器名称 Chrome Firefox Edge Internet Explorer Opera Safari
    是否支持 YES NO YES 8.0+ YES YES
  2. 移动版

    浏览器名称 Android Chrome Firefox Edge IE mobile Opera Safari
    是否支持 YES YES NO YES ? YES YES

Content Security Policy

功能

Content Security Policy可以看成X-XSS-Protection的更高级版本。虽然X-XSS-Protection能阻止来自请求中的XSS攻击,但是它并不能阻止来自本服务器上恶意的脚本或者链接到外面服务器上的恶意脚本。

CSP定义了浏览器可以加载的资源来源。你可以为script,images,fonts,css设置一个白名单

使用方法

CSP不能阻止所有的XSS攻击,但是它能明显减轻XSS的攻击影响,在深度防御XSS中是一个重要的方式

平台 使用方法
Rails4,5 使用secureheaders
Django 使用django-csp
Express.js 使用helmet/csp
go 使用unrolled/secure
Nginx add_header Content-Security-Policy "";
Apache Header always set Content-Security-Policy ""
Varnish set resp.http.Content-Security-Policy = "";
使用示例

Content-Security-Policy: script-src 'self' https://apis.google.com

只会下载本域及apis.google.com中的脚本

Content-Security-Policy "base-uri 'self'

限制文档base元素中只能使用当前域名

浏览器兼容性
浏览器名称 Chrome Firefox Edge IE mobile Opera Safari
是否支持 25+ 23.0+ 14+ 10+ 15+ 7+
meta元素 YES 45+ YES NO YES YES

更多参数点此查看

HTTP Strict Transport Security (HSTS)

功能

当我们想与某人进行安全通讯时,我们要面对两个问题:第一个问题就是隐私;我们想保证除了对方以外,没有第二个人能收到我们的信息。第二个问题就是身份认证;即我们怎么知道收到消息的人就是我们想发送的人。

HTTPS可以通过加密方式解决第一个问题,但是它在身份认证方面还是有一些问题。HSTS请求头可以解决"你自己知道与你通讯的人是否支持加密"这个问题。

HSTS可以减少sslstrip攻击中间人攻击, 当你使用了一个被恶意攻击者控制的WIFI网络,攻击者可以使你与服务器之间的加密无效。即使网站仅支持HTTPS协议,攻击者也可以通过HTTP流量进行中间人攻击,不需要SSL证书。

Strict-Transport-Security请求头可以告诉浏览器必须始终使用你网站的加密。只要你使用了HSTS请求头并且没有过期,它就会不允许网站不加密,当请求不是通过HTTPS的时候就会爆错。

使用方法
平台 使用方法
Rails4 config.force_ssl = true,默认情况下不要包含子域名,config.ssl_options = { hsts: { subdomains: true } }
Rails5 config.force_ssl = true
Django SECURE_HSTS_SECONDS = 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS = True
Express.js 使用helmet
go 使用unrolled/secure
Nginx add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; ";
Apache Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;
Varnish set resp.http.Strict-Transport-Security = "max-age=31536000; includeSubdomains; ";
使用示例
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload

HTTP Public Key Pinning(HPKP)

功能

WEB上的信息是建立在证书颁发机构(CA)模型上的。两个CA可以向两个不同的人发送同一个域的证书,并且浏览器都信任他们,这就产生了一个问题,这种情况下,CA证书是可以“被妥协”的,所以攻击者就可以中间人攻击他们想攻击的目标,尽管那些目标站使用了SSL和HSTS!

HPKP请求头就是来解决这个问题的,这个请求头可以绑定一个证书。当浏览器第一次收到这个请求头的时候,它就会保存该证书。对于在max-age时间范围内的所有请求,浏览器都会返回失败,除非从服务器发送的信息中至少有一个证书是被绑定了的。

使用方法
平台 使用方法
Rails4,5 Use secureheaders
Django Write custom middleware
Express.js 使用helmet
go 使用unrolled/secure
Nginx add_header Public-Key-Pins 'pin-sha256=""; pin-sha256=""; max-age=5184000; includeSubDomains';
Apache Header always set Public-Key-Pins 'pin-sha256=""; pin-sha256=""; max-age=5184000; includeSubDomains';
Varnish set resp.http.Public-Key-Pins = "pin-sha256=""; pin-sha256=""; max-age=5184000; includeSubDomains";
使用示例
Public-Key-Pins: pin-sha256=<base64==>; max-age=<expireTime>;
Public-Key-Pins: pin-sha256=<base64==>; max-age=<expireTime>; includeSubDomains
Public-Key-Pins: pin-sha256=<base64==>; max-age=<expireTime>; report-uri=<reportURI>

includeSubDomains :HPKP适用的子域名

report-uri:发送报告URL

浏览器兼容性
  1. PC版

    浏览器名称 Chrome Firefox Edge Internet Explorer Opera Safari
    是否支持 YES 35.0 NO ? YES ?
    report-uri 46 NO ? ? 33 ?
  2. 移动

    浏览器名称 Android Chrome Firefox Edge IE mobile Opera Safari
    是否支持 YES YES ? 35.0 ? YES ?
    report-uri YES YES ? NO ? 33 ?

X-Frame-Options

功能

用来给浏览器指示允许一个页面可否在 ,