最近在做安全扫描相关的工作,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
来源:https://www.cnblogs.com/navitmin-home/p/8001453.html