HTTP安全响应头

不羁岁月 提交于 2020-03-19 12:44:53

最近在做安全扫描相关的工作,appscan扫描出来的一些项目,提示未添加安全头。于是在内网和google上到处搜了下。大致弄懂了。现在做个笔记吧。

什么是安全响应头:现代浏览器提供了一些安全相关的响应头,使用这些响应头一般只需要修改服务器配置即可,不需要修改程序代码,成本很低。

目的:保护用户的安全,也就是通常意义上的防止用户受到各种攻击,如XSS、CSRF。

 

1.Content-Security-Policy 中文名内容安全策略,简称CSP,主要的思想是通过内容来源白名单机制,使浏览器仅渲染或执行来自这些来源的资源。

例如,如果我们仅信赖来自www.exapmle.com和自己服务器上的资源,我们可以通过以下配置来确定:

Content-Security-Policy: default-src 'self' https://www.exapmle.com

这里我们使用default-src指令设置了默认资源的来源,当收到来自非本服务器或exapmle.com的站点内容时,由于白名单机制,将不会被执行。需要注意的是,default-src指令定义未指定的大多数指令的默认值。 一般情况下,这适用于以 -src 结尾的任意指令。如果未设置诸如script-src等用于覆盖default-src,那么就会默认遵从default-src的设置。

下面列出一些常见的指令:

  • base-uri 用于限制可在页面的 <base> 元素中显示的网址。
  • child-src 用于列出适用于工作线程和嵌入的帧内容的网址。例如:child-src https://youtube.com 将启用来自 YouTube(而非其他来源)的嵌入视频。 使用此指令替代已弃用的 frame-src 指令。
  • connect-src 用于限制可(通过 XHR、WebSockets 和 EventSource)连接的来源。
  • font-src 用于指定可提供网页字体的来源。Google 的网页字体可通过 font-src https://themes.googleusercontent.com 启用。
  • form-action 用于列出可从 <form> 标记提交的有效端点。
  • frame-ancestors 用于指定可嵌入当前页面的来源。此指令适用于 <frame><iframe><embed> 和 <applet> 标记。此指令不能在 <meta> 标记中使用,并仅适用于非 HTML 资源。
  • frame-src 已弃用。请改用 child-src
  • img-src 用于定义可从中加载图像的来源。
  • media-src 用于限制允许传输视频和音频的来源。
  • object-src 可对 Flash 和其他插件进行控制。
  • plugin-types 用于限制页面可以调用的插件种类。
  • report-uri 用于指定在违反内容安全政策时浏览器向其发送报告的网址。此指令不能用于 <meta> 标记。
  • style-src 是 script-src 版的样式表。
  • upgrade-insecure-requests 指示 User Agent 将 HTTP 更改为 HTTPS,重写网址架构。 该指令适用于具有大量旧网址(需要重写)的网站。

每条指令中的来源列表都是灵活的。您可以按架构(data:https:)指定来源,也可按各种具体条件指定来源范围,这些条件从仅限定主机名(example.com,即匹配该主机上的任意来源:任意架构、任意端口)到完全限定 URI(https://example.com:443,仅匹配 HTTPS、仅匹配 example.com 和仅匹配端口 443),不一而足。接受使用通配符,但通配符仅可用作架构、端口,或者仅可位于主机名的最左侧:*://*.example.com:* 将与 example.com 使用任何架构、位于任何端口上的所有子域名(但 example.com 本身除外)匹配。

此来源列表还接受四个关键字:

  • 如您所料,'none' 不执行任何匹配。
  • 'self' 与当前来源(而不是其子域)匹配。
  • 'unsafe-inline' 允许使用内联 JavaScript 和 CSS。
  • 'unsafe-eval' 允许使用类似 eval 的 text-to-JavaScript 机制。

 之所以有unsafe-inline和unsafe-eval关键字,是因为考虑到内联代码是有害的。因为攻击者会使用内联代码注入攻击,浏览器将无法区分内联代码究竟来自何处。

在我实际的开发过程中,发现已有的项目使用了大量的内联代码,若禁止内联,则原先的页面由于白名单政策,将无法正常显示。再考虑到业务,是运行在客户内部网络,受到攻击的可能性较小,并且也有其他手段防止xss攻击。因此,后来在nginx上配置CSP头的时候,放开了内联代码的限制。

下面来看一个示例:

Content-Security-Policy: default-src 'self'; img-src *; script-src 'self' www.example.com; css-src 'self' 'unsafe-inline' www.example.com

在这里,各种内容已经由default-src规定,只能从'self'处获取。但是,通过script-src等指令,成功添加了部分例外。例如,img-src *表示能从任意处获取图片,script-src 'self' www.exampe.com表示能从本站和固定网址获得脚本,css-src指令则额外强调了允许内联样式。

2. 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 中嵌套。

配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 'http', 'server' 或者 'location' 的配置中:

add_header X-Frame-Options SAMEORIGIN;

3. X-Content-Type-Options

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

 nosniff 只应用于 "script" 和 "style" 两种类型。事实证明,将其应用于图片类型的文件会导致与现有的站点冲突

4. Strict-Transport-Security

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

一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。

这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。

当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。

每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。

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

5、X-XSS-Protection

 当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。

X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>

0禁止XSS过滤。

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

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

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

 

别人怎么用

最后,我们来看看几个实际案例:

Google+,使用了这几个本文提到的响应头:

BASH

x-content-type-options: nosniff

x-frame-options: SAMEORIGIN

x-xss-protection: 1; mode=block

Twitter使用了这些:

BASH

strict-transport-security: max-age=631138519

x-frame-options: SAMEORIGIN

x-xss-protection: 1; mode=block

PayPal的:

BASH

X-Frame-Options: SAMEORIGIN

Strict-Transport-Security: max-age=14400

Facebook则使用了这些(配置了详细的CSP,关闭了XSS保护):

BASH

strict-transport-security: max-age=60

x-content-type-options: nosniff

x-frame-options: DENY

x-xss-protection: 0

content-security-policy: default-src *;script-src https://*.facebook.com http://*.facebook

 

参考链接:

1、http://blog.jobbole.com/60143/

2、https://developer.mozilla.org/zh-CN/docs/Web/Security/CSP/Using_Content_Security_Policy

3、https://developers.google.com/web/fundamentals/security/csp/?hl=zh-cn

4、https://imququ.com/post/content-security-policy-reference.html

5、https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options

6、https://www.xiaoyu.net/1147.html

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!