使用HTTP响应头字段来提高Web安全性

安全 nginx centos7 运维 · warm · 于 6个月前 发布 · 414 次阅读

总体Security headers配置举例

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self';  style-src  'unsafe-inline'  'unsafe-eval'  'self';  script-src  'unsafe-inline' 'self' *.bestyii.com analysis.bestyii.com *.baidu.com *.google-analytics.com;  img-src 'self' data: oss.bestyii.com *.baidu.com *.google-analytics.com;  connect-src  'self'  *.baidu.com ;"; #按需配置
add_header X-Permitted-Cross-Domain-Policies master-only;
add_header X-Download-Options noopen;

详细header头说明

X-Frame-Options

X-Frame-Options HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 , , 或者 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击

  • 语法 X-Frame-Options 有三个可能的值:
    X-Frame-Options: deny
    X-Frame-Options: sameorigin
    X-Frame-Options: allow-from https://example.com/
    
  • 指南说明

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

    deny

    表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

    sameorigin

    表示该页面可以在相同域名页面的 frame 中展示。

    allow-from uri

    表示该页面可以在指定来源的 frame 中展示。

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

add_header X-Frame-Options SAMEORIGIN;

具体详情配置清参考链接:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options


X-Content-Type-Options

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

这个消息首部最初是由微软在 IE 8 浏览器中引入的,提供给网站管理员用作禁用内容嗅探的手段,内容嗅探技术可能会把不可执行的 MIME 类型转变为可执行的 MIME 类型。在此之后,其他浏览器也相继引入了这个首部,尽管它们的 MIME 嗅探算法没有那么有侵略性。

站点安全测试人员通常欢迎对这个首部进行设置。

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

  • 语法
    X-Content-Type-Options: nosniff
    
  • 指南说明

    nosniff 下面两种情况的请求将被阻止:

    1. 请求类型是"style" 但是 MIME 类型不是 "text/css",
    2. 请求类型是"script" 但是 MIME 类型不是 JavaScript MIME 类型

nginx 配置举例

add_header X-Content-Type-Options nosniff;

更多详情参考网站https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-Content-Type-Options


X-XSS-Protection

X-XSS-Protection 用于启用浏览器的 XSS 过滤功能,以防止 XSS 跨站脚本攻击。当检测到跨站脚本攻击 (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指令的功能发送违规报告。

nginx 配置举例

add_header X-XSS-Protection "1; mode=block";

更多详情参考配置https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection


Content-Security-Policy

Content-Security-Policy 用于控制当外部资源不可信赖时不被读取。用于防止 XSS 跨站脚本攻击或数据注入攻击(但是,如果设定不当,则网站中的部分脚本代码有可能失效)。允许站点管理者控制用户代理能够为指定的页面加载哪些资源 之前的字段名为 X-Content-Security-Policy

  • 语法
    Content-Security-Policy: <policy-directive>; <policy-directive>
    
  • 指南说明

    通过获取指令来控制某些可能被加载的确切的资源类型的位置。

    child-src

    child-src:为 web workers 和其他内嵌浏览器内容(例如用和加载到页面的内容)定义合法的源地址。 如果开发者希望管控内嵌浏览器内容和 web worker 应分别使用frame-src和worker-src 指令,来相对的取代 child-src。

    connect-src

    connect-src:限制能通过脚本接口加载的URL。

    default-src

    default-src:为其他取指令提供备用服务fetch directives。

    font-src

    font-src:设置允许通过@font-face加载的字体源地址。

    frame-src

    frame-src: 设置允许通过类似和标签加载的内嵌内容的源地址。

    img-src

    img-src: 限制图片和图标的源地址

    manifest-src

    manifest-src : 限制应用声明文件的源地址。

    media-src

    media-src:限制通过、或标签加载的媒体文件的源地址。

    object-src

    object-src:限制、、标签的源地址。 被object-src控制的元素可能碰巧被当作遗留HTML元素,导致不支持新标准中的功能(例如中的安全属性sandbox和allow)。因此建议限制该指令的使用(比如,如果可行,将object-src显式设置为'none')。

    prefetch-src

    指定预加载或预渲染的允许源地址。

    script-src

    限制JavaScript的源地址。

    style-src

    限制层叠样式表文件源。

    webrtc-src

    指定WebRTC连接的合法源地址。

    worker-src

    限制Worker、SharedWorker或者ServiceWorker脚本源。

nginx 配置举例

add_header Content-Security-Policy "default-src 'self';  style-src  'unsafe-inline'  'self';  script-src  'unsafe-inline' 'self' *.bestyii.com analysis.bestyii.com *.baidu.com *.google-analytics.com;  img-src 'self' data: oss.bestyii.com *.baidu.com *.google-analytics.com;  connect-src  'self'  *.baidu.com ;"; #按需配置

‘unsafe-inline’和‘unsafe-eval’表达式重新启用内联JavaScript和动态代码执行,这些默认情况下都是被CSP禁用的。理想情况下,通常不会希望在策略里保留这些表达式,但没有它们大多数现有的应用都会被阻断。 default-src 'self':允许读取来自于同源(域名+主机+端口号)的所有内容 *.example.com:允许读取来自于指定域名及其所有子域名的所有内容

更多配置参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policyhttps://www.cnblogs.com/Hwangzhiyoung/p/9146740.html


X-Permitted-Cross-Domain-Policies

X-Permitted-Cross-Domain-Policies 现代浏览器提供了许多可选的安全相关功能与特性,这些功能与特性通常可以通过 HTTP 响应头来控制,使用这些功能,可以避免受到浏览器端的用户受到类似CSRF、XSS、Click Hijacking 等前端黑客攻击的影响。Web 服务器对于 HTTP 请 求的响应头中缺少 X-Permitted-Cross-Domain-Policies,这将导致浏览器提供的安 全特性失效。 当一些在线的 Web Flash 需要加载其他域的内容时,很多 Web 会通 过设置一个 crossdomain.xml 文件的方式来控制其跨域方式。很有可能有些开发者 并没有修改 crossdomain.xml 文件的权限,但是又有和跨域的 Flash 共享数据的需 求,这时候可以通过设置 X-Permitted-Cross-Domain-Policies 头的方式来替代 crossdomain.xml 文件

  • 语法

    X-Permitted-Cross-Domain-Policies: master-only
    
  • 指南说明

    permitted-cross-domain-policies属性值有如下情况:

    none

    不允许使用loadPolicyFile方法加载任何策略文件,包括此主策略文件。

    master-only:

    只允许使用主策略文件[默认值]。

    by-content-type:

    只允许使用loadPolicyFile方法加载HTTP/HTTPS协议下Content-Type 为text/x-cross-domain-policy的文件作为跨域策略文件。

    by-ftp-filename:

    只允许使用loadPolicyFile方法加载FTP协议下文件名为 crossdomain.xml的文件作为跨域策略文件。

    all:

    可使用loadPolicyFile方法加载目标域上的任何文件作为跨域策略文件,甚至是一 个JPG也可被加载为策略文件。

nginx 配置举例

add_header X-Permitted-Cross-Domain-Policies master-only;

Strict-Transport-Security

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

  • 语法
    Strict-Transport-Security: max-age=<expire-time>
    Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
    Strict-Transport-Security: max-age=<expire-time>; preload
    
  • 指南说明
    max-age=<expire-time>

    设置在浏览器收到这个请求后的<expire-time>秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。 当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS >###### includeSubDomains 可选 >如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。

    preload 可选

    查看 预加载 HSTS 获得详情。不是标准的一部分

nginx 配置举例

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";

更多详情配置参考https://developer.mozilla.org/zh-CN/docs/Security/HTTP_Strict_Transport_Security


Referrer-Policy

Referrer-Policy 首部用来监管哪些访问来源信息——会在 Referer 中发送——应该被包含在生成的请求当中

  • 语法
    Referrer-Policy: no-referrer
    Referrer-Policy: no-referrer-when-downgrade
    Referrer-Policy: origin
    Referrer-Policy: origin-when-cross-origin
    Referrer-Policy: same-origin
    Referrer-Policy: strict-origin
    Referrer-Policy: strict-origin-when-cross-origin
    Referrer-Policy: unsafe-url
    
  • 指令说明
no-referrer

整个 Referer 首部会被移除。访问来源信息不随着请求一起发送。 no-referrer-when-downgrade (默认值) 在没有指定任何策略的情况下用户代理的默认行为。在同等安全级别的情况下,引用页面的地址会被发送(HTTPS->HTTPS),但是在降级的情况下不会被发送 (HTTPS->HTTP)。

origin

在任何情况下,仅发送文件的源作为引用地址。例如 https://example.com/page.html 会将 https://example.com/ 作为引用地址。

origin-when-cross-origin

对于同源的请求,会发送完整的URL作为引用地址,但是对于非同源请求仅发送文件的源。

same-origin

对于同源的请求会发送引用地址,但是对于非同源请求则不发送引用地址信息。

strict-origin

在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS),但是在降级的情况下不会发送 (HTTPS->HTTP)。

strict-origin-when-cross-origin

对于同源的请求,会发送完整的URL作为引用地址;在同等安全级别的情况下,发送文件的源作为引用地址(HTTPS->HTTPS);在降级的情况下不发送此首部 (HTTPS->HTTP)。

unsafe-url

无论是同源请求还是非同源请求,都发送完整的 URL(移除参数信息之后)作为引用地址。 这项设置会将受 TLS 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。

nginx 配置例子

add_header Referrer-Policy "origin-when-cross-origin, strict-origin-when-cross-origin";

更多配置参考https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy


共收到 0 条回复
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册