GX博客

分享个人 Full-Stack JavaScript 项目开发经验

设置重要的安全响应标头

设置一些安全相关的响应标头,可以帮助减少 web 应用程序的受攻击面。对于 Koa 框架,我们可以选择koa-helmet作为安全响应头设置的中间件。它是对原helmet的封装,使其能够作为 koa 中间件使用。


koa-helmet 的安装及调用方式

  1. 本地安装 koa-helmet 。

    yarn add koa-helmet
  2. app.js 中引用 koa-helmet。

    const helmet = require("koa-helmet");
  3. 在应用级别中尽可能早的调用 koa-helmet 中间件。

    app.use(helmet());

    helmet 将会调用以下默认中间件为我们统一设置响应标头。

    var DEFAULT_MIDDLEWARE = [
      'dnsPrefetchControl',
      'frameguard',
      'hidePoweredBy',
      'hsts',
      'ieNoOpen',
      'noSniff',
      'xssFilter'
    ]

    设置对应属性值为 false 可禁用默认的中间件:

    app.use(helmet(
      {
        hidePoweredBy: false
      }
    ));

koa-helmet 包含的所有中间件及对应的响应标头


contentSecurityPolicy


该中间件根据 User-Agent 请求标头,发送不同的内容安全策略(CSP)响应标头。例如,版本 25 之前的 Chrome 使用名为 X-WebKit-CSP 的备用标头(实际上很多旧版本标头已被弃用),而标准标头为 Content-Security-Policy。

CSP 不是盲目地信任服务器提供的所有内容,而是允许你定义 Content-Security-Policy 响应标头创建可信内容源白名单,并指示浏览器仅从这些源执行或呈现资源。即使攻击者可以找到漏洞注入脚本,脚本不与白名单匹配,也不会被执行。

Content-Security-Policy: default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; child-src 'self'

上面是 Content-Security-Policy 响应标头的一个例子,可以看到它包含 default-src、script-src 等指令。后面介绍各个指令及其值的设置方式。

  • base-uri

    指定可以出现在页面 <base> 元素中的 URL 。

  • child-src

    指定了子框架和通过元素加载的镶嵌浏览上下文的源,如 <frame> 和 <iframe>。

  • connect-src

    指定可以连接的源。适用于 XMLHttpRequest(AJAX),WebSocket 或 EventSource。如果不允许,浏览器将模拟 400(Bad Request) HTTP 响应状态代码。

  • default-src

    指定加载内容的默认策略,包括 JavaScript、图像、CSS、字体、AJAX 请求、框架、HTML5 媒体等内容。

  • font-src

    指定可以为 Web 字体提供服务的来源。

  • form-action

    列出从 <form> 标签提交的有效端点。

  • frame-ancestors

    指定可以嵌入当前页面的源。该指令适用于 <frame>、<iframe>、<embed>、和 <applet> 等标签。此指令不能在 <meta> 标记中使用,仅适用于非HTML资源。将此指令设置 'none' 为大致相当于 X-Frame-Options: DENY 响应标头。

  • img-src

    指定有效的图像源。

  • media-src

    指定允许传送视频和音频的来源,如 HTML5 的 <audio>、<video> 元素。

  • object-src

    指定有效的插件源,如 <object>、<embed> 或 <applet>。

  • plugin-types

    为 <object> 和 <embed> 这样的插件定义有效的 MIME 类型(如 application/pdf)。若要加载 <applet>,那么你必须给出 application/x-java-applet。

  • report-uri

    指定在违反内容安全策略时浏览器将策略失败的报告 POST 到此 URI。你还可以使用 Content-Security-Policy -Report-Only 标头来设定策略,以指示浏览器这些设定策略失败时仅发送报告(不阻止任何内容)。该指令不能在 <meta> 标签中使用。

  • script-src

    指定有效的 JavaScript 源。

  • style-src

    指定有效的样式表来源。

  • upgrade-insecure-requests

    指示用户代理重写 URL 方案,将 HTTP 更改为 HTTPS。此指令适用于需要重写大量旧 URL 的网站。

上面所有以 -src 结尾的指令都支持类似的来源白名单列表值设置方式。多个白名单值,使用空格分开。除了 'none',它们应该是唯一的。必须注意,某些值不能省略引号。

  • *

    通配符,允许除 data: blob: filesystem: schemes 之外的任何 URL。

  • 'none'

    禁止从任何来源加载资源。

  • 'self'

    允许从同源(即相同的方案、主机和端口)加载资源。

  • data:

    允许通过数据方案加载资源(如 Base64 编码图像)。

  • https:

    允许任何域上通过 HTTPS 加载资源。

  • domain.example.com

    允许从指定域名加载资源。

  • *.example.com

    允许从 example.com 下的任何子域加载资源。

  • https://cdn.com

    允许在与给定域匹配的 HTTPS 加载资源。

  • 'unsafe-inline'

    允许使用内联源元素,如 style 属性、onclick、script 标签内的脚本(取决于应用它的源的上下文)和 javascript: URIs。

  • 'unsafe-eval'

    允许不安全的动态代码赋值,如 eval()。

  • 'nonce-'

    如果标签的 nonce 属性值与该响应标头值匹配,则允许 script 或 style 标签执行。形如:<script nonce="2726c7f26c">alert("hello");</script>。注意,每次请求时要刷新这个 nonce 值。

  • 'sha256-'

    如果特定脚本或样式匹配该哈希,则允许执行(不适用于 javascript: URIs)。例如:sha256-qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng= 将允许 alert('Hello, world.'); 执行。目前 CSP 支持 sha256-、sha384- 和 sha512-。

CSP 默认完全禁止内联源,因为浏览器没有将非法内联源与合法内联源区分开的机制。

CSP 默认也会完全阻止 eval()、new Function()、setTimeout([string], ...)、setInterval([string], ...) 等可以注入文本转换为可执行 JavaScript 的做法。

回顾开头的 CSP 响应标头实例,它从一个阻止所有源的默认策略开始(default-src 'none'),并在后面设置了脚本、样式表、图片、连接和子框架的有效源。另外,除了 frame-ancestors、report-uri、sandbox 指令不能在 meta 标签中设置外,其它指令均可以在 meta 标签中设置。与上面的响应标头对应的 meta 标签为:

<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; child-src 'self'">

如果你没有为一个指令设置一个特定的策略,也没有设置 default-src 'none',那么该指令默认就像你指定了 * 为有效源一样。

对于试验性的策略我们应该使用 Content-Security-Policy-Report-Only 设置。这是评估应用程序 CSP 更改效果的好方法:打开新策略的报告,监控违规报告并修复出现的任何错误,然后在你对其影响满意后开始执行新策略。

对应 contentSecurityPolicy 中间件的参数如下:

  • reportOnly

    可以是布尔值,或者返回布尔值的函数(接收 req、res 参数)。返回 true 则使用 Content-Security-Policy-Report-Only 标头,默认不使用。

  • browserSniff

    布尔值,默认为 true。设置是否根据 User-Agent 请求标头,使用对应的备用标头。

  • setAllHeaders

    布尔值,User-Agent 请求标头存在的情况下,默认 false。设置是否使用所有标头(包括旧标头)。

  • disableAndroid

    布尔值,默认为 false。设置是否禁止在安卓浏览器下设置该响应标头(旧的安卓浏览器可能很怪异)。

  • directives

    指令对象,必须为它设置具体指令属性。

对于 directives 指令属性的值,也可以使用函数形式返回值,如:

const uuid = require("node-uuid");
const helmet = require("koa-helmet");
// ...
app.use(async (ctx, next) => {
  ctx.res.state = {};
  ctx.res.state.nonce = ctx.state.nonce = uuid.v4();
  await next();
});
// ...
app.use(helmet({
  contentSecurityPolicy: {
     directives: {
      // ...
      scriptSrc: ["'self'", (req, res) => `'nonce-${res.state.nonce}'`]
    }
  }
}));

CSP 仅在新版本的 Chrome、Firefox 和 IE Edge 中得到支持。因为其要求较严格,目前很多第三方库也未能支持它的标准。相信它会在不久的将来得到更好的支持。

我们应该在项目开发前尽可能地确定要实施的策略,然后依照它编写代码。用渐进的方式实施策略,确保它不会导致程序故障。

在实际项目中,我们也可以不同路由使用不同的安全策略。它旨在减少程序的受攻击面。


permittedCrossDomainPolicies


该中间件设置 X-Permitted-Cross-Domain-Policies 消息头用于处理 Adobe 等的 web 客户端的跨域请求。其默认值为 X-Permitted-Cross-Domain-Policies: none。该响应标头还有其它可选值。它们需要你创建 crossdomain.xml 定义跨域策略的文件。这些值通过 permittedPolicies 属性指定,如:

permittedCrossDomainPolicies: {
  permittedPolicies: 'master-only'
}

下面是不同值得含义:

  • none

    目标服务器上的任何位置都不允许使用策略文件,包括此主策略文件。

  • master-only

    仅允许此主策略文件。

  • by-content-type

    仅允许使用 Content-Type:text/x-cross-domain-policy 提供的策略文件。

  • all

    允许此目标域上的所有策略文件。

把其设置为 none,可以减少 web 程序受攻击面。更多相关信息,请阅读OWASP上的“X-Permitted-Cross-Domain-Policies”部分Adobe的跨域策略规范

dnsPrefetchControl


该中间件帮助设置 X-DNS-Prefetch-Control 响应标头的值,默认为 off。你可以通过属性值 allow 开启或关闭 DNS 预取 ,如:

dnsPrefetchControl: {
  allow: true
}

当你访问 URL 时,浏览器必须查找域名的 IP 地址。例如,它必须解决从 example.com 映射到 93.184.216.34 的问题,此过程称为 DNS。

浏览器可以在用户点击链接或从某个地方加载资源之前启动这些 DNS 请求(DNS 预取)。

DNS请求占用带宽非常小,但延迟可能非常高,尤其是在移动网络上。通过推测性地预取 DNS 结果,可以在某些时候显著减少延迟,例如当用户点击链接时。在某些情况下,延迟可以减少一秒。

在某些浏览器中实现此预取域名解析与获取实际页面内容并行(而不是串行)。通过这样做,高延迟域名解析过程在获取内容时不会导致任何延迟。

页面加载时间可以通过这种方式得到显着改善,特别是在移动网络上。如果可以在请求图像之前解析图像的域名,则加载许多图像的页面在加载图像时可以看到 5% 或更多的速度提升。

然而 DNS 预取对用户具有隐私隐患。窃听者可以根据 DNS 预取流量,推断页面中出现超链接的主机名。还可以监视包含特定链接的内容是否已经被查看,即使未点击该链接。它看起来好像是用户正在访问他们没有访问的内容。

该 X-DNS-Prefetch-Control 响应标头告诉浏览器是否应该做 DNS 预取。设置为 on 可能不起作用(因为并非所有浏览器都支持 DNS 预取),但可以在所有支持的浏览器上设置为 off 禁用它(大多数浏览器不进行 DNS 预取,因此大多数浏览器都可以忽略此响应标头)。

要了解 X-DNS-Prefetch-Control 响应标头的浏览器兼容情况,请点击这里

除了设置响应标头,我们还可以通过 html 的 meta 标签开启或禁用 DNS 预取,如:

<meta http-equiv="x-dns-prefetch-control" content="off">

设置 link 元素的 rel 属性可强制查找特定主机名,如:

<link rel="dns-prefetch" href="http://www.spreadfirefox.com/">
默认情况下,不会对通过 HTTPS 加载的文档执行嵌入式链接主机名的 DNS 预取。此限制有助于防止窃听者根据 DNS 预取流量推断出 HTTPS 页面中出现的超链接的主机名。

expectCt


相关专业名词:CT 即 Certificate Transparency,证书透明度。(CT 项目是一项完全开放的 Google 项目,该项目背后的基本思想是提高颁发的 x.509 证书的透明度。这也意味着其它浏览器未必支持这策略。)而 CA 是 Certificate Authority,证书颁发机构。SCT 即 Signed Certificate Timestamp,签名证书时间戳。

证书通常由发布它们的 CA 提交给 CT 日志,SCT 是提交证书时来自 CT 日志的响应。

Chrome 将要求2017年10月及之后颁发的所有证书都必须记录在 CT 日志中,否则它们将不受信任。Expect-CT 响应标头让你可以从浏览器获得反馈,以查看它是否对收到的签名证书时间戳感到满意。并且站点所有者可以快速识别错误颁发的证书,和检测恶意 CA 变得更加容易。该标头有三个指令:

  • enforce

    指令控制浏览器是应该强制执行策略(未收到满意 CT 信息时终止连接)还是将其视为仅报告模式。

  • max-age

    指定浏览器应缓存并应用收到策略的秒数,不管是强制还是仅报告模式。

  • report-uri

    指定浏览器在没有收到有效 CT 信息的情况下应该发送报告的 URI(需要是绝对 URI)。

这三个指令对应中间件的三个配置属性,例子如下:

expectCt: {
  enforce: true,
  maxAge: 30,
  reportUri: 'http://example.com/report'
}

featurePolicy


Feature-Policy 是一个较新的安全响应标头,以允许网站所有者在自己的网页上以及他们嵌入的网页上启用和禁用某些网络平台功能。它已经在 Chrome 和 Safari 中获得支持。了解详细的策略控制功能列表请点击这里

看下面的简单例子。

Feature-Policy: camera 'none';

它对于源的限制方式,跟 CSP 相似。

  • *

    这将允许当前页面和任何嵌套浏览上下文(如 iframe)使用该功能。

  • 'self'

    这将允许当前页面和任何嵌套同源浏览上下文使用该功能。

  • 'none'

    这将禁用当前页面和任何嵌套浏览上下文使用该功能。

  • origin(s)

    只允许指定的来源使用此功能。例如 https://example.com,多个来源空格隔开。

上面例子作用是禁止当前页面和任何嵌套浏览上下文对视频输入设备的访问,对应中间件的设置如下:

featurePolicy: {
  features: {
    camera: ["'none'"]
  }
}
随着更多浏览器支持的推出,我们将会从部署它们中获得越来越多的好处。

frameguard


该中间件设置 X-Frame-Options 响应标头,以减轻点击劫持(UI-覆盖攻击)攻击。默认设置为 X-Frame-Options: SAMEORIGIN 。

该响应标头的三种设置形式:

  1. X-Frame-Options: DENY

    将阻止任何人将此页面放在iframe中。

  2. X-Frame-Options: SAMEORIGIN

    将阻止任何人将此页面放在iframe中,除非它们同源。这意味着你可以将自己的页面放在 iframe 中,但其他人不可以。

  3. X-Frame-Options: ALLOW-FROM http://example.com

    将允许 http://example.com 把你的页面放在 iframe 中。(不幸的是,你只能允许一个域。)

frameguard 中间件接收两个参数:action、domain。action 可选值为 deny、sameorigin、allow-from。当 action 为 allow-from 时候,domain 参数用于指定允许域名。例如:

frameguard: {
  action: 'allow-from',
  domain: 'http://example.com'
}
该响应标头有很好的浏览器支持,但 ALLOW-FROM 指令没有很多浏览器支持。不支持的情况下,该响应标头会被整个忽略,然后在 iframe 中显示。了解详细的浏览器兼容情况,请点击这里

hidePoweredBy


该中间件用于移除或重设 X-Powered-By 响应标头,默认为移除。它通过 setTo 属性可设置标头的具体值:

hidePoweredBy: {
  setTo: 'PHP 4.2.0'
}

一般地,X-Powered-By 响应标头用于表明支持当前网页应用程序的技术。这可能会被黑客利用,根据服务器程序的一些已知漏洞攻击你的服务器。为了减慢黑客的攻击速度或阻止懒惰的黑客,我们可以隐藏这个响应标头,或者伪装成其它的程序。(但这样做可能会失去客户端的一些识别技术支持。)

值得一提,如果你使用 Nginx 作为反向代理,它会在接收 web 应用程序响应后,添加 Server 响应标头(如 Server: Nginx/1.15.2)再转发给客户端。Server 响应标头用于表明服务器的名字。Nginx 可以在 http、server 和 location 块中配置 server_tokens off; 以隐藏版本号。如果想进一步去除这个响应标头,你可以尝试为 Nginx 添加允许修改响应标头的模块或补丁。


hpkp


该中间件用于帮助你设置 Public-Key-Pins 响应标头,告诉 web 客户端将特定加密公钥与某个 web 服务器相关联,以降低使用伪造证书进行MITM(中间人攻击) 攻击的风险。了解各浏览器对此标头的兼容情况,请点击这里

假设你信任的其中一个 CA 遭到入侵,则攻击者可以使用盗取的私钥为他们喜欢的任何网站签署证书。当攻击者可以向你的客户发送伪造的证书,并使用受信任的 CA 的私钥进行签名时,客户端并不知道公钥是伪造的。

使用 HTTP 公钥锁定,当用户第一次访问你的网站时,他们可以看到你固定了一些公钥。他们会将这些存放起来,然后在每次后续访问时,确保公钥与他们存储的公钥匹配。如果它们不匹配,则可能意味着 CA 受到了损害,客户端向用户发出警告。

Public-Key-Pins 响应标头包含以下键:

  • pin-sha256

    引用的字符串是 Base64 编码的主体公钥信息(SPKI)指纹。可以为不同的公钥指定多个 pin。

  • max-age

    浏览器应记住使用其中一个已定义的密钥访问此站点的时间(以秒为单位)。

  • includeSubDomains(可选)

    如果指定了这参数,则此规则也适用于站点所有的子域。

  • report-uri(可选)

    如果指定了此可选参数,则会将 pin 验证失败报告发送给指定的 URI。

例子:

Public-Key-Pins:
  pin-sha256="cUPcTAZWKaS7sWs=";
  pin-sha256="M8HztCzHKhpGPWE=";
  max-age=5184000;
  includeSubDomains;
  report-uri="https://www.example.org/hpkp-report"

hpkp 中间件的对应设置:

hpkp: {
  maxAge: 5184000,
  sha256s: ['cUPcTAZWKaS7sWs=', 'M8HztCzHKhpGPWE='],
  includeSubdomains: true,
  reportUri: 'https://example.com/hpkp-report',
  reportOnly: false,
  setIf: function (req, res) {
    if (req.secure) {
      return true;
    } else {
      return false;
    }
  }
}

当 reportOnly 为 true 时,使用 Public-Key-Pins-Report-Only 标头。setIf 用于设置使用标头的条件,返回 true 时使用该标头,返回 false 则不使用。

建议不要使用此标头(以及此中间件)。在部署时要非常小心,很容易因滥用此标头而导致问题。

hsts


该中间件设置 Strict-Transport-Security 响应标头以使你的用户保持 HTTPS 状态。

当第一次使用 HTTPS 访问你的站点并返回 Strict-Transport-Security 响应标头,浏览器会记录此信息,以便将来使用 HTTP 加载站点的尝试将自动使用 HTTPS。

当 Strict-Transport-Security 响应标头指定的到期时间过后,下一次通过 HTTP 加载站点的尝试将正常进行,而不是自动使用 HTTPS。

每当 Strict-Transport-Security 响应标头传送到浏览器,它将更新该站点的到期时间,因此站点可以刷新此信息并防止超时到期。如果把 max-age 设置为0(通过一次 https 连接设置),将立即使 Strict-Transport-Security 标头失效,允许通过 http 访问。

如果网站通过 HTTP 接受连接并重定向到 HTTPS,则访问者最初可能会在重定向之前与网站的非加密版本进行通信。例如,访问者键入 http://www.abc.com,甚至是只是 abc.com,这为中间人攻击创造了机会。可以利用重定向将访问者引导到恶意站点而不是原始站点的安全版本。初次使用 HTTP 访问你的站点时,浏览器会忽略 Strict-Transport-Security 响应标头。

Strict-Transport-Security 响应标头包含以下键:

  • max-age:设置该响应标头的有效时间(单位为秒)。
  • includeSubDomains:把规则应用到所有的子域。
  • preload:如果希望域名包含在 Chrome 维护的HSTS预加载列表中,则使用此项。

例子:

Strict-Transport-Security: max-age=15552000; includeSubDomains

对应中间件的设置如下(同时这也是该中间件的默认设置值):

hsts: {
  maxAge: 180 * 24 * 60 * 60,
  includeSubDomains: true,
  preload: false
}

使用HTTPS旨在提供机密性、完整性和身份等好处,能对窃听和中间人攻击提供合理的防护。

HTTPS 仅防止某些类型的攻击(嗅探攻击、冒充攻击),它与跨站点脚本,SQL注入或无数其它漏洞无关。

更多 Strict-Transport-Security 的介绍可查阅MDN上的“HTTP严格传输安全性”OWASP上的“HTTP严格传输安全备忘单”维基百科上的“HTTP严格传输安全性”

ieNoOpen


该中间件设置响应标头 X-Download-Options: noopen,以阻止旧版本的 Internet Explorer 在你的站点上下文中执行下载的恶意 HTML。它必须首先在本地保存文件,稍后打开本地保存的文件时,它将不再在你站点的安全上下文中执行,从而有助于防止脚本注入。该中间件不需要传入参数。


noCache


该中间件旨在通过设置多个标头来禁用浏览器缓存。不需要传入参数,它做的事情是设置以下四个缓存响应标头,以禁用浏览器缓存:

Cache-Control: no-store, no-cache, must-revalidate, proxy-revalidate
Expires: 0
Pragma: no-cache
Surrogate-Control: no-store

使用 Pragma 标头是为了更好地支持旧浏览器。

缓存对于用户体验有很多好处。事实上,使用ETag标头,是一种非常安全的缓存机制。

注意,当你使用 Nginx 为 Node.js 应用程序提供静态资源服务时,你不能在 Node.js 应用程序中设置这些响应标头,而应在 Nginx 配置中设置它们,因为静态资源直接由 Nginx 响应。

noSniff


该中间件设置响应标头 X-Content-Type-Options: nosniff,用来告诉客户端一定要遵循在 Content-Type 响应标头中对 MIME 类型的设定,而不能对其进行修改。这样有助于防止浏览器尝试猜测(嗅探)MIME 类型,那可能具有安全隐患。该中间件不需要传入参数。

MIME 类型是一种确定你正在查看的文件类型的方式。当你的浏览器加载文件时,它会读取服务器的 Content-Type 响应标头以确定其中的内容。

MIME 嗅探可以作为攻击媒介。它把不可执行的 MIME 类型转变为可执行的 MIME 类型(但只在用户直接调用 URL 时才会执行此操作)。例如,用户可以上传具有 .jpg 文件扩展名的图像,但其内容实际上是 HTML。访问该图像可能会导致浏览器“运行” HTML 页面,其中可能包含恶意 JavaScript。

把 X-Content-Type-Options 设置为 nosniff 时,浏览器将不会嗅探 MIME 类型,它们将信任服务器所说的内容并在资源错误时阻止该资源。

这个响应标头最初是由微软在 IE 8 浏览器中引入,对于更低版本的 IE 并不能识别。对于高版本的现代浏览器一般不会进行 MIME 嗅探。

referrerPolicy


该中间件用于设置 Referrer-Policy 响应标头的值,默认为 no-referrer。该标头用于控制浏览器在域内发起请求时设置 Referer 请求标头的方式。以下是各个值的浏览器处理方式:

  • 空字符串

    不指定引用策略,并且其它地方也没有具体设定,则按照 no-referrer-when-downgrade 方式处理。

  • no-referrer

    向任何源发出请求时都不发送 Referer 请求标头。

  • no-referrer-when-downgrade

    当从 TLS 保护的站点向不受保护的站点发送请求时,不发送 Referer 请求标头。

  • same-origin

    当请求的是同源 URL 时发送 Referer 请求标头,否则不发送。

  • origin

    只发送域名加 '/' 的 Referer 请求标头。

  • strict-origin

    从 TLS 保护站点向可信 URL 发送请求或从非 TLS 保护站点向任何 URL 发送请求时候,只发送域名加 '/' 的 Referer 请求标头。其它情况不发送 Referer 请求标头。

  • origin-when-cross-origin

    向非同源 URL 发送请求时候,只发送域名加 '/' 的 Referer 请求标头。请求同源 URL 时,发送完整的 Referer 请求标头。

  • strict-origin-when-cross-origin

    当请求同源 URL 时,发送完整的 Referer 请求标头。跨源时,只有从 TLS 保护站点向可信 URL 发送请求或从非 TLS 保护站点向任何 URL 发送请求时,发送域名加 '/' 的 Referer 请求标头。其它情况不发送 Referer 请求标头。

  • unsafe-url

    发送完整的 Referer 请求标头。(这可能会泄露 TLS 保护的资源到不安全来源。)

中间件通过 policy 属性设置标头值,如:

referrerPolicy: { policy: 'same-origin' }

xssFilter


该中间件设置 X-XSS-Protection 响应标头以防止简单的反射 XSS 攻击(页面中的 <script> 标签代码与查询字符串中的内容匹配)。

该响应标头是 Internet Explorer,Chrome 和 Safari 的一项功能,检测到反射 XSS 时阻止页面加载。虽然这些保护在现代浏览器中很大程度上是不必要的,当站点实现强大的 Content-Security-Policy(CSP)禁用内联 JavaScript 时,它们仍然可以为尚未支持 CSP 的旧版 Web 浏览器的用户提供保护。

注意,在火狐、IE Edge 等浏览器会忽略该响应标头,这也意味着不能依赖它来完全防止反射 XSS 攻击。

标头的可选值如下:

  • X-XSS-Protection:0

    禁用 XSS 过滤。

  • X-XSS-Protection: 1;

    启用 XSS 过滤。如果检测到反射 XSS 攻击,浏览器将清理页面(删除不安全的部分)。

  • X-XSS-Protection: 1; mode=block

    启用 XSS 过滤(通常在支持的浏览器中默认此设置)。如果检测到攻击,浏览器将阻止呈现页面,而不是清理页面。

  • X-XSS-Protection: 1; report=your-reporting-uri(仅限 Chromium)

    启用XSS过滤。如果检测反射 XSS 攻击,浏览器将清理页面并报告违规。它使用 CSP 的 report-uri 指令功能来发送报告。

该中间件默认地设置为 1; mode=block。并接收两个参数:

  • reportUri

    发送违规报告的 URI。

  • setOnOldIE

    设置为 true 时,强制在所有版本的 IE 上将响应标头设置为 1; mode=block。默认在 IE 9+ 设置,旧版本 IE 设置为 0 禁用。在旧版本的 IE 中,此标头会导致更严重的安全漏洞,因此设置为 false 禁用它才是明智之举。

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://leeguangxing.cn/blog_post_16.html