我的编程空间,编程开发者的网络收藏夹
学习永远不晚

分析CORS跨域资源共享

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

分析CORS跨域资源共享

本篇内容主要讲解“分析CORS跨域资源共享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析CORS跨域资源共享”吧!

了解下同源策略

  •     源(origin)*:就是协议、域名和端口号;

  •     同源: 就是源相同,即协议、域名和端口完全相同;

  •     同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源;

  •     同源策略的分类

      1 . DOM 同源策略:即针对于DOM,禁止对不同源页面的DOM进行操作;如不同域名的 iframe 是限制互相访问。

      2 . XMLHttpRequest 同源策略:禁止使用 XHR 对象向不同源的服务器地址发起 HTTP 请求。

  •  不受同源策略限制:

      1.  页面中的链接,重定向以及表单提交(因为表单提交,数据提交到action域后,本身页面就和其没有关系了,不会管请求结果,后面操作都交给了action里面的域)是不会受到同源策略限制的。

      2.  资源的引入不受限制,但是js不能读写加载的内容:如嵌入到页面中的<script class="lazy" data-src="..."></script>,<img>,<link>,<iframe>等

为什么要跨域限制

  •  如果没有 DOM 同源策略:那么就没有啥xss的研究了,因为你的网站将不是你的网站,而是大家的,谁都可以写个代码操作你的网站界面

  •  如果没有XMLHttpRequest 同源策略,那么就可以很轻易的进行CSRF(跨站请求伪造):

      1.  用户登录了自己的网站页面 a.com,cookie中添加了用户标识。

      2.  用户浏览了恶意页面 b.com,执行了页面中的恶意 AJAX 请求代码。

      3.  b.com 向 a.com发起 AJAX HTTP 请求,请求会默认把 a.com对应cookie也同时发送过去。

      4.  a.com从发送的 cookie 中提取用户标识,验证用户无误,response 中返回请求数据;数据就泄露了。而且由于Ajax在后台执行,这一过程用户是无法感知的。

  •  (附)有了XMLHttpRequest 同源策略就可以限制CSRF?别忘了还有不受同源策略的:表单提交和资源引入,(安全问题下期在研究)

跨域决解方案

  1. JSONP 跨域:借鉴于 script 标签不受浏览器同源策略的影响,允许跨域引用资源;因此可以通过动态创建 script 标签,然后利用 class="lazy" data-src 属性进行跨域;

      缺点:

    1.所有网站都可以拿到数据,存在安全性问题,需要网站双方商议基础token的身份验证。

    2.只能是GET,不能POST。

    3.可能被注入恶意代码,篡改页面内容,可以采用字符串过滤来规避此问题。

  2. 服务器代理:浏览器有跨域限制,但是服务器不存在跨域问题,所以可以由服务器请求所要域的资源再返回给客户端。

  3. document.domain、window.name 、location.hash:借助于iframe决解DOM同源策略

  4. postMessage:决解DOM同源策略,新方案

  5. CORS(跨域资源共享):这里讲的重点

CORS(跨域资源共享)

  •  HTML5 提供的标准跨域解决方案,是一个由浏览器共同遵循的一套控制策略,通过HTTP的Header来进行交互;主要通过后端来设置CORS配置项

CORS简单使用

  •  之前说得CORS跨域,嗯嗯,后端设置Access-Control-Allow-Origin:*|[或具体的域名]就好了;

  • 初次尝试: 

app.use(async(ctx,next) => {      ctx.set({          "Access-Control-Allow-Origin": "http://localhost:8088"  })
  •  发现有些请求可以成功,但是有些还是会报错:

分析CORS跨域资源共享

  •  请求被同源策略阻止,预请求的响应没有通过检查:http返回的不是ok?

  •  并且发现发送的是OPTIONS请求:

分析CORS跨域资源共享

  •  发现:CORS规范将请求分为两种类型,一种是简单请求,另外一种是带预检的非简单请求 

简单请求和非简单请求

  •  浏览器发送跨域请求判断方式:

    •   浏览器在发送跨域请求的时候,会先判断下是简单请求还是非简单请求,如果是简单请求,就先执行服务端程序,然后浏览器才会判断是否跨域;

    •   而对于非简单请求,浏览器会在发送实际请求之前先发送一个OPTIONS的HTTP请求来判断服务器是否能接受该跨域请求;如果不能接受的话,浏览器会直接阻止接下来实际请求的发生。

  •  什么是简单请求

     1. 请求方法是如下之一:

        GET

        HEAD

        POST

     2. 所有的Header都只包含如下列表中(没有自定义header):

        Cache-Control

        Content-Language

        Content-Type

        Expires

        Last-Modified

        Pragma

  •  除此之外都是非简单请求

CORS非简单请求配置须知

  •  正如上图报错显示,对于非简单请求,浏览器会先发送options预检,预检通过后才会发送真是的请求;

  •  发送options预检请求将关于接下来的真实请求的信息给服务器: 

Origin:请求的源域信息  Access-Control-Request-Method:接下来的请求类型,如POST、GET等  Access-Control-Request-Headers:接下来的请求中包含的用户显式设置的Header列表
  •  服务器端收到请求之后,会根据附带的信息来判断是否允许该跨域请求,通过Header返回信息: 

Access-Control-Allow-Origin:允许跨域的Origin列表  Access-Control-Allow-Methods:允许跨域的方法列表  Access-Control-Allow-Headers:允许跨域的Header列表,防止遗漏Header,因此建议没有特殊需求的情况下设置为*  Access-Control-Expose-Headers:允许暴露给JavaScript代码的Header列表  Access-Control-Max-Age:浏览器预检请求缓存时间,单位为s

CORS完整配置

 1. koa配置CORS跨域资源共享中间件:

const cors = (origin) => {      return async (ctx, next) => {          ctx.set({              "Access-Control-Allow-Origin": origin, //允许的源          })          // 预检请求          if (ctx.request.method == "OPTIONS") {              ctx.set({                  'Access-Control-Allow-Methods': 'OPTIONS,HEAD,DELETE,GET,PUT,POST', //支持跨域的方法                  'Access-Control-Allow-Headers': '*', //允许的头                  'Access-Control-Max-Age':10000, // 预检请求缓存时间                  // 如果服务器设置Access-Control-Allow-Credentials为true,那么就不能再设置Access-Control-Allow-Origin为*,必须用具体的域名                  'Access-Control-Allow-Credentials':true // 跨域请求携带身份信息(Credential,例如Cookie或者HTTP认证信息)              });              ctx.send(null, '预检请求')          } else {              // 真实请求              await next()          }      }  }  export default cors
  •  现在不管是简单请求还是非简单请求都可以跨域访问啦~

跨域时如何处理cookie

  •  cookie:

      我们知道http时无状态的,所以在维持用户状态时,我们一般会使用cookie;

      cookie每次同源请求都会携带;但是跨域时cookie是不会进行携带发送的;

  •  问题:

      由于cookie对于不同源是不能进行操作的;这就导致,服务器无法进行cookie设置,浏览器也没法携带给服务器(场景:用户登录进行登录操作后,发现响应中有set-cookie但是,浏览器cookie并没有相应的cookie)

  •  决解:

      浏览器请求设置withCredentials为true即可让该跨域请求携带 Cookie;使用axios配置axios.defaults.withCredentials = true

      服务器设置Access-Control-Allow-Credentials=true允许跨域请求携带 Cookie

到此,相信大家对“分析CORS跨域资源共享”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

分析CORS跨域资源共享

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在PHP开发中处理跨域资源共享(CORS)问题?

如何在PHP开发中处理跨域资源共享(CORS)问题?在Web开发中,跨域资源共享(CORS)是一个常见的问题。它指的是当一个网页请求一个跨源资源(例如,从一个不同的域名)时,浏览器会使用一种特殊的机制来阻止或限制对该资源的访问。这是为了确保
如何在PHP开发中处理跨域资源共享(CORS)问题?
2023-11-02

CORScross-originresoursesharing跨域资源共享解决

这篇文章主要为大家介绍了CORScross-originresoursesharing跨域资源共享的解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

跨域(CORS)问题的解决方案分享

跨域是指跨域名的访问,如果域名和端口都相同,但是请求路径不同,不属于跨域。跨域不一定会有跨域问题。因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。
2023-02-13

如何实现跨域图片资源权限CORS enabled image

这篇文章主要介绍了如何实现跨域图片资源权限CORS enabled image,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。HTML 规范文档为 images 引入了 cro
2023-06-08

分时操作系统:一个共享资源的交响曲

分时操作系统通过共享资源,允许多个用户同时访问和交互,从而形成了协作和高效的环境。它的核心思想是通过调度策略和内存管理技术,在进程之间合理分配时间片和资源,在改善用户体验和系统效率的同时降低成本。
分时操作系统:一个共享资源的交响曲
2024-03-05

React Native断点调试跨域资源加载出错问题的原因分析

React Native 是一种用于构建移动应用的框架,它使用的是 JavaScript 和 React 的语法。在使用 React Native 进行开发时,有时可能会遇到跨域资源加载出错的问题,导致断点调试无法正常进行。下面是可能导致此
2023-09-01

React Native断点调试 跨域资源加载出错问题的原因分析

React Native断点调试时遇到跨域资源加载出错的问题可能有以下几个原因:1. 网络请求配置问题:React Native的网络请求使用的是XMLHttpRequest或Fetch API,跨域资源加载出错可能是因为请求的URL不在允
2023-09-23

局域网中提供并管理共享资源的计算机叫什么

这篇文章主要介绍了局域网中提供并管理共享资源的计算机叫什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。局域网中,提供并管理共享资源的计算机称为“网络服务器”。网络服务器是计
2023-06-15

编程热搜

目录