• 响应头缺失、Options方法


    X-Frame-Options

    X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在其他页面种引用。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking(点击劫持)

    语法:

    X-Frame-Options: deny
    X-Frame-Options: sameorigin
    X-Frame-Options: "allow-from https://example.com/" nginx种""引号是必须要写的哦!
    
    • 1
    • 2
    • 3

    说明:

    deny
    表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
    
    sameorigin
    表示该页面可以在相同域名页面的 frame 中展示。
    
    allow-from uri
    表示该页面可以在指定来源的 frame 中展示。
    
    deny、sameorigin、allow-from仅仅允许使用一种配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    举例:

    nginx:

    格式:add_header 响应头名称 响应头对应的值 [always];
    name是添加的头名称,value是对应的值,always可选

    在不添加always的情况下,add_header只对响应码为200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), 308 (1.13.0)这些生效(括号内是nginx版本)。也就是说当服务端返回响应异常,响应码不是上述之一的话,即使nginx有配跨域头信息,浏览器仍然会显示跨域错误。原因就是因为nginx对异常响应码添加add_header无效。
    实际工作中往往前端需要捕获服务端异常响应,这时在nginx跨域add_header上加上always,使nginx对任何响应码生效

    add_header X-Frame-Options "SAMEORIGIN";
    
    • 1

    Apache

    格式:Header [condition] set|append|add|unset|echo 响应头名称 响应头对应的值

    可选条件可以是 onsuccess 或者 always。它确定应该操作哪个内部头表。onsuccess代表 2xx状态码而always代表所有状态码(包括2xx)

    • set

      响应标题被设置,用这个名字替换任何以前的标题。该值可以是格式字符串。

      Header always append X-Frame-Options "SAMEORIGIN"
      Header always set X-Frame-Options "deny"
      
      $ curl -I http://localhost
       X-Frame-Options: deny
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • append

      响应头的值被追加到任何现有的相同名称的头。当一个新的值被合并到一个已经存在的响应头上时,用逗号分开。这是添加多个值的HTTP标准方式。

      Header always append X-Frame-Options "SAMEORIGIN"
      Header always append X-Frame-Options "deny"
      
      $ curl -I http://localhost
      X-Frame-Options: SAMEORIGIN,deny
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • add

      响应标题被添加到现有的标题集,即使这个标题已经存在。这可能会导致两个(或更多)标题具有相同的名称。这可能会导致不可预见的后果,应该使用“附加”来代替

      Header always append X-Frame-Options "SAMEORIGIN"
      Header always add X-Frame-Options "deny"
      
      $ curl -I http://localhost
      X-Frame-Options: SAMEORIGIN
      X-Frame-Options: deny
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • unset

      如果该名称存在,则会删除该名称的响应标题。如果有多个相同名称的标题,则全部将被删除

      Header always append X-Frame-Options "SAMEORIGIN"
      Header always unset X-Frame-Options 
      
      $ curl -I http://localhost
      
      • 1
      • 2
      • 3
      • 4
    • echo

      带有这个名字的请求头在回应头中回显。标题可能是一个正则表达式。

    对于 setappendaddunset,大小写是忽视的,但 echo 的 响应头名称是大小写敏感的,并且可以是正则表达式。

    Header always append X-Frame-Options "SAMEORIGIN"
    
    • 1

    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
    
    • 1

    说明:

    nosniff 下面两种情况的请求将被阻止:
      请求类型是"style" 但是 MIME 类型不是 "text/css",
      请求类型是"script" 但是 MIME 类型不是 JavaScript
    
    • 1
    • 2
    • 3

    举例:

    Nginx

    add_header X-Content-Type-Options "nosniff";
    
    • 1

    Apache

    Header always append X-Content-Type-Options "nosniff"
    
    • 1

    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=
    
    • 1
    • 2
    • 3
    • 4

    说明:

    0
    禁止XSS过滤
    
    1
    启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
    
    1;mode=block
    启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
    
    1; report= (Chromium only)
    启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    举例:

    Nginx:

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

    Apache

    Header always append X-XSS-Protection "1; mode=block"
    
    • 1

    Content-Security-Policy

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

    语法:

    Content-Security-Policy: ; 
    
    • 1

    说明:

    通过获取指令来控制某些可能被加载的确切的资源类型的位置。
    
    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脚本源。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    举例:

    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 ;"; #按需配置
    
    • 1

    Apache

    Header always append 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 ;"; #按需配置
    
    • 1

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

    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
    
    • 1

    说明:

    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也可被加载为策略文件。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    举例:

    Nginx:

    add_header X-Permitted-Cross-Domain-Policies "master-only";
    
    • 1

    Apache

    Header always append X-Permitted-Cross-Domain-Policies "master-only"
    
    • 1

    Strict-Transport-Security

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

    语法:

    Strict-Transport-Security: max-age=
    Strict-Transport-Security: max-age=; includeSubDomains
    Strict-Transport-Security: max-age=; preload
    
    • 1
    • 2
    • 3

    说明:

    max-age=
    单位秒,设置在浏览器收到这个请求后的秒的时间内凡是访问这个域名下的请求都使用HTTPS请求。 当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS.
    
    includeSubDomains 
    可选 如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。
    
    preload 
    可选查看预加载HSTS获得详情。不是标准的一部分
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    举例:

    Nginx

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

    Apache

    Header always append Strict-Transport-Security "max-age=31536000; includeSubdomains;"
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    说明:

    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 安全协议保护的资源的源和路径信息泄露给非安全的源服务器。进行此项设置的时候要慎重考虑。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    举例:

    Nginx

    add_header Referrer-Policy "origin";
    
    • 1

    Apache

    Header always append Referrer-Policy "origin"
    
    • 1

    X-Download-Options

    X-Download-Options用于防止直接打开用户下载

    语法:

    X-Download-Options:noopen
    
    • 1

    说明:

    noopen用于指定IE 8以上版本的用户不打开文件而直接保存文件,在下载对话框中不显示打开选项
    
    • 1

    举例:

    Nginx

    add_header X-Download-Options "noopen";
    
    • 1

    Apache

    Header always append  X-Download-Options "noopen"
    
    • 1

    启用Options方法

    Nginx

    server {
        .....
        if ($request_method ~* OPTIONS) {
            return 403;
        }
        .....
    }
    或者
    server {
        .....
        if ($request_method !~* (GET|POST)) {
            return 403;
        }
        .....
    }
    
    检测方法(注意:curl默认的请求方法是HEAD)
    curl -v -X OPTIONS http://localhost:8080
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Apache

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
    RewriteRule .* - [F]
    或者
    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} !(GET|POST)
    RewriteRule .* - [F]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    检测方法(注意:curl默认的请求方法是HEAD)
    curl -v -X OPTIONS http://localhost:8080

    允许跨域

    Nginx

    add_header Access-Control-Allow-Origin *; 
    #如果指定域名,必须加上前面的协议 比如add_header Access-Control-Allow-Origin "https://www.baidu.com";
    
    add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, accept";
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Apache

    Header set Access-Control-Allow-Origin *
    #如果指定域名,必须加上前面的协议 比如add_header Access-Control-Allow-Origin "https://www.baidu.com"
    Header set Access-Control-Allow-Headers "Content-Type"
    Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    借助AI力量,赋能程序员高效工作与压力缓解之道
    environment = environ[‘wsgi.websocket‘] KeyError: ‘wsgi.websocket‘
    复制粘贴(二):操作剪贴板 navigator.clipboard
    XSS 漏洞详解
    如何利用google的protobuf设计、实现自己的RPC框架
    【2022新版】Java 终极学习路线(文末高清大图)-共计9大模块/6大框架/13个中间件
    SpringBoot项目:Cannot find declaration to go to
    SPI机制
    ubuntu查看实时网速
    Nacos 集群搭建
  • 原文地址:https://blog.csdn.net/m0_37642477/article/details/126657830