跨域问题浅析

什么是源(域)

在W3C的定义中,源是由协议主机(IP 地址或者域名)端口三者确定。如果两个 URL 的协议主机(IP 地址或者域名)端口都一样的话,那么这两个 URL 就是同源的。

同源策略

由于源与源之间是未知且默认的,所以非本源中的资源(即URL对应的资源)是不可控的。在早期的互联网,不同源的内容可以随意访问。因此有人就借此来攻击网站。如,在JavaScript脚本中添加恶意代码,然后让目标网站访问加载,从而实现攻击目标网站(即,XSS攻击)。此外还有CSRF(Cross-Site Request Forgery,跨站请求伪造)网络攻击的方式。由此可见,限制不同源之间的资源访问非常重要。

因此,出于安全的考虑,最早由Netscape公司于1995年在自家浏览器中引入同源策略,对不同源之间的资源交互进行了限制。后续各家浏览器厂商跟进引入。目前,所有的浏览器都在实行这个政策。

需要注意的是,并不是所有的不同源的资源交互操作都是禁止的。诸如,script 标签、img 标签等是允许跨域访问。

不同源也称为跨域。一般情况下,两者是同一个意思。

如何实现跨域资源共享

虽然同源策略保证了网站的安全,但很多时候又不得不访问不同源的资源。其实,在早期的时候,人们巧妙的借助script 标签、img 标签可以加载不同域资源的特性来实现跨域资源访问。即,JSONP (2005年)和 图片Ping。但这两种技术都存在一定的限制以及安全隐患,现在不是很推荐使用。后来,W3C在2014年1月16日正式发布CORS(Cross-Origin Resource Sharing,跨域资源共享)标准方案,定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。使得跨域资源共享成为了一项安全可控可靠的技术。目前主流的浏览器已全部支持。

现在,最常用的跨域资源共享的技术是 CORSJSONP 更多情况下是 CORS 的一种替代方案(例如,不支持 CORS 的老浏览器);而 图片 Ping 技术基本很少见了。

跨域资源共享(CORS)

CORS(Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的 HTTP header组成,这些 HTTP 标头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。借助 CORS,web 服务器可以选择哪些跨域请求允许访问到它们的资源

CORS 工作过程

CORS 很简单,浏览器将 CORS 需要的相关信息通过请求头发送给服务器,服务器根据请求过来的信息判断是否允许访问,并把结果回传给浏览器。浏览器对接收的到信息进一步做处理,对于被拒绝的请求给出 CORS 错误。

  1. 首先浏览器依照 CORS 的规定,根据请求接口的复杂度区分为简单请求复杂请求
    1. 简单请求:将在请求头中附带Origin发送给 web 服务器
    2. 复杂请求:将根据请求的基本信息(包括OriginAccess-Control-Request-Method等)生成一个预检请求(Preflight request),向 web 服务器询问是否支持 CORS 。
  2. 当 web 服务器接收到请求时, 针对不同请求有如下处理:
    1. 简单请求:根据请求头中的Origin来决定是否拒绝响应。
      • 如果Origin指定的源,不在许可范围内,服务器会返回一个正常的 HTTP 响应。浏览器发现,这个响应的头信息没有包含Access-Control-Allow-Origin字段就知道出错了,从而拦截响应数据并抛出 CORS 错误,被XMLHttpRequestonerror回调函数捕获;
      • 如果服务器认为这个请求可以接受,则在响应头中的Access-Control-Allow-Origin中会发接受的源信息。
    2. 预检请求:根据请求头中的OriginAccess-Control-Request-Method以及Access-Control-Request-Headers来判断是否允许这种类型的请求。
      • 如果服务器确认允许这一类的请求,则响应正常,并在响应头中携带Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers以及Access-Control-Max-Age等字段。然后,浏览器发送真实请求。这时发送的真实请求的处理逻辑和简单请求一致。
      • 如果服务器否认这一类的请求,同样会返回一个正常的 HTTP 响应。但是没有任何 CORS 相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此拦截响应数据触发一个错误,被XMLHttpRequest对象的onerror回调函数捕获。

关于浏览器拦截跨域请求的响应内容

当一个请求被浏览器识别为不允许的跨域请求时,浏览器会自动拦截请求的响应内容,阻止响应内容加载到渲染进程中。这也就是为什么在 Devtools 的 Network 中查看被阻止的跨域请求时,Response 是一片空白的原因。

其中,针对跨域标签(如:<script><img>)请求的响应内容,浏览器主要采用 CORB(Cross-Origin Read Blocking)技术来进行拦截。CORB 是一种判断是否要在跨站资源数据到达页面之前阻断其到达当前站点进程中的算法,降低了敏感数据暴露的风险。了解即可,详见:Cross-Origin Read Blocking (CORB) - 掘金 (juejin.cn)

借助CORS,Web 服务器就可以精确的控制跨域请求,只对可信的域的请求开放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/683209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数解 transformer 之 self attention transformer 公式整理

千万不要从任何角度轻看 transformer&#xff0c;重要的话说四遍&#xff1a; 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer 千万不要从任何角度轻看 transformer Attention is all you need 整个项目是鬼斧神工之作&#xff0c;巧夺天工之作&a…

Spring 用法学习总结(三)之 AOP

Spring学习 7 bean的生命周期8 AOP面向切面编程8.1 AOP相关术语8.2 AOP使用 7 bean的生命周期 bean的生命周期主要为bean实例化、bean属性赋值、bean初始化、销毁bean&#xff0c;其中在实例化和初始化前后都使用后置处理器方法&#xff0c;而InstantiationAwareBeanPostProce…

2024大健康展,山东省大健康产业博览会,济南营养健康展会

立足济南&#xff0c;面向世界&#xff0c;2024第六届中国国际大健康产业博览会&#xff0c;定档2024年5月27-29日&#xff0c;在济南黄河国际会展中心举办&#xff1b; 2024第6届中国&#xff08;济南&#xff09;国际大健康产业博览会&#xff08;China-DJK山东健博会&#…

控制论与科学方法论

《控制论与科学方法论》&#xff0c;真心不错。 书籍原文电子版PDF&#xff1a;https://pan.quark.cn/s/00aa929e4433&#xff08;分类在学习目录下&#xff09; 备用链接&#xff1a;https://pan.xunlei.com/s/VNgj2vjW-Hf_543R2K8kbaifA1?pwd2sap# 控制论是一种让系统按照我…

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

MyBatis篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 MyBatis 的接口绑定?有哪些实现方式?二、使用 MyBatis 的 mapper 接口调用时有哪些要求?三、Mapper 编写有哪几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…

面试官:介绍一下MVC框架

前言 大家好&#xff0c;我是chowley&#xff0c;MVC相信大家都听说过&#xff0c;今天我就记录一下我心中的MVC框架 MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;用于将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&…

书生浦语大模型实战营-课程笔记(2)

介绍了一下InternLm的总体情况。 InternLm是训练框架&#xff0c;Lagent是智能体框架。 这个预训练需要这么多算力&#xff0c;大模型确实花钱。 Lagent是智能体框架&#xff0c;相当于LLM的应用。 pip设置 开发机的配置 pip install transformers4.33.1 timm0.4.12 sente…

计算机二级数据库之数据模型

数据模型 模型的概念 模型的介绍模型是对现实世界特征的模拟和抽象&#xff0c; 数据模型的概念&#xff1a; 数据模型是对现实世界中数据特征的抽象&#xff0c;描述的是数据的共性。 数据模型是用来在数据库中抽象、表示和处理现实世界中的数据和信凹。 其相关的共同特…

vue项目搭建测试

5&#xff0c;项目测试 导入elementplus以及样式 import ElementPlus from element-plus import element-plus/dist/index.csscreateApp(App).use(store).use(router).use(ElementPlus).mount(#app)<template><el-row class"mb-4"><el-button>De…

MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)

目录 主要内容 模型研究 1.改进二进制粒子群算法&#xff08;BPSO&#xff09; 2.模型分析 结果一览 下载链接 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》&#xff0c;主要做的是一个考虑需求响应的机组组合…

投资银行在网络安全生态中的作用

文章目录 一、投资银行的含义(一)并购买方。(二)并购卖方。(三)IPO辅助。(四)投资银行业务的另一方面是帮助这些交易融资。二、从投资银行角度看网络安全产业(一)行业的短期前景三、复杂的网络安全并购(一)行业知识对投资银行业务很重要(二)在网络安全领域,技术…

HDFS的超级用户

一. 解释原因 HDFS(Hadoop Distributed File System)和linux文件系统管理一样&#xff0c;也是存在权限控制的。 但是很不一样的是&#xff0c; 在Linux文件系统中&#xff0c;超级用户Superuser是root而在HDFS中&#xff0c;超级用户Superuser是启动了namenode的用户&#x…

neo4j下载安装最新教程 2024.02

文章目录 neo4j简介下载地址配置环境变量命令行启动验证安装结果 neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库&#xff0c;它将结构化数据存储在网络&#xff08;从数学角度叫做图&#xff09;上而不是表中。Neo4j 也可以被看作是一个高性能的图引擎&#xff0c;该引擎具…

python 字典

字典是一种可变容器模型&#xff0c;且可存储任意类型对象。 字典中的键必须是可哈希的&#xff0c;即不可变的数据类型&#xff0c;如字符串、数字、元组等。列表、字典等可变数据类型不能作为字典的键。 ​#创建字典-----使用{}&#xff0c;每个键值对用冒号分隔&#xff0…

mathtype公式

Mathtype 手写板 Win11手写板按钮灰色问题解决&#xff1a;在C:\Program Files\Common Files\microsoft shared\ink目录下粘贴mip.exe&#xff0c;C:\Program Files\Common Files\microsoft shared\ink\en-US目录下添加mip.exe.mui提取码y04v 公式识别 配合免费图片公式识别…

【开源】在线办公系统 JAVA+Vue.js+SpringBoot+MySQL

目录 1 功能模块1.1 员工管理模块1.2 邮件管理模块1.3 人事档案模块1.4 公告管理模块 2 系统展示3 核心代码3.1 查询用户3.2 导入用户3.3 新增公告 4 免责声明 本文项目编号&#xff1a; T 001 。 \color{red}{本文项目编号&#xff1a;T001。} 本文项目编号&#xff1a;T001。…

runc中文翻译系列一 runc入门

runc 是一个 CLI 工具&#xff0c;用于根据 OCI 规范在 Linux 上孕育和运行容器。 发布 你可以在 release 页面找到 runc 的正式发布版本。 构建 runc 仅支持 Linux。它必须使用 Go 1.19 或更高版本构建。 为了启用 seccomp 支持&#xff0c;你需要在你的平台上安装 libse…

磁盘database数据恢复: ddrescue,dd和Android 设备的数据拷贝

ddrescue和dd 区别&#xff1a; GNU ddrescue 不是 dd 的衍生物&#xff0c;也与 dd 没有任何关系 除了两者都可用于将数据从一台设备复制到另一台设备。 关键的区别在于 ddrescue 使用复杂的算法来复制 来自故障驱动器的数据&#xff0c;尽可能少地造成额外的损坏。ddrescue…