【计算机网络】同源策略及跨域问题

1. 同源策略

同源策略是一套浏览器安全机制,当一个的文档和脚本,与另一个的资源进行通信时,同源策略就会对这个通信做出不同程度的限制。

同源策略对 同源资源 放行,对 异源资源 限制。因此限制造成的开发问题,称之为跨域(异源)问题

1.1 同源和异源

源(origin) = 协议 + 域名 + 端口

请添加图片描述

1.2 跨域出现的场景

  • 网络通信

    a元素的跳转(href);加载css、js、图片等(src);AJAX等等

  • JS API

    window.openwindow.parentiframe.contentWindow等等

  • 存储

    WebStorageIndexedDB等等

1.3 网络中的跨域

请求页面的源称之为页面源,在该页面中发出的请求称之为目标源

当页面源和目标源一致时,则为同源请求,否则为异源请求(跨域请求)

2. 解决方案

2.1 CORS

CORS(Cross-Origin Resource Sharing)是最正统的跨域解决方案,同时也是浏览器推荐的解决方案。
请添加图片描述
CORS将请求分为两类:简单请求预检请求

2.1.1 简单请求

完整判定逻辑

简单来说,只要全部满足下列条件,就是简单请求:

  • 请求方法是GETPOSTHEAD之一

  • 头部字段满足CORS安全规范,详见 W3C

    浏览器默认自带的头部字段都是满足安全规范的,只要开发者不改动和新增头部,就不会打破此条规则

  • 如果有Content-Type,必须是下列值中的一个:(axios等库需要时会自动更改Content-Type

    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
2.1.2 预检请求(preflight)

只要不是简单请求,均为预检请求。

2.1.3 服务器对请求的验证
2.1.3.1 对简单请求的验证

请添加图片描述

2.1.3.2 对预检请求的验证
  1. 发送预检请求

image-20230112204634493

  1. 发送真实请求(和简单请求一致)
2.1.4 两个小问题
2.1.4.1 关于cookie

默认情况下,ajax的跨域请求并不会附带cookie,这样一来,某些需要权限的操作就无法进行。

不过可以通过简单的配置就可以实现附带cookie。

// xhr
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;// fetch api
fetch(url, {credentials: "include"
})

这样一来,该跨域的ajax请求就是一个附带身份凭证的请求。

当一个请求需要附带cookie时,无论它是简单请求,还是预检请求,都会在请求头中添加cookie字段。

而服务器响应时,需要明确告知客户端:服务器允许这样的凭据。

告知的方式也非常的简单,只需要在响应头中添加:Access-Control-Allow-Credentials: true即可。

对于一个附带身份凭证的请求,若服务器没有明确告知,浏览器仍然视为跨域被拒绝。

另外要特别注意的是:对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为*。这就是为什么不推荐使用*的原因。

2.1.4.2 关于跨域获取响应头

在跨域访问时,JS只能拿到一些最基本的响应头,如:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma,如果要访问其他头,则需要服务器设置本响应头。

Access-Control-Expose-Headers头让服务器把允许浏览器访问的头放入白名单,例如:

Access-Control-Expose-Headers: authorization, a, b

这样JS就能够访问指定的响应头了。

2.2 JSONP

没有CORS方法的时候。

image-20230112205613983

虽然可以解决问题,但JSONP有着明显的缺陷:

  • 仅能使用GET请求

  • 容易产生安全隐患

    恶意攻击者可能利用callback=恶意函数的方式实现XSS攻击

  • 容易被非法站点恶意调用

因此,除非是某些特殊的原因,否则永远不应该使用JSONP。

// server.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(cors());
app.use(bodyParser.json());// jsonp
app.get('/jsonp', (req, res) => {const cbname = req.query.callback || 'callback';const data = {msg: '来自服务器的消息',};res.set('content-type', 'application/javascript');res.end(`${cbname}(${JSON.stringify(data)})`);
});// proxy
app.get('/hero', async (req, res) => {const axios = require('axios');const resp = await axios.get('https://pvp.qq.com/web201605/js/herolist.json');// 使用CORS解决对代理服务器的跨域res.header('access-control-allow-origin', '*');res.send(resp.data);
});const PORT = 9527;app.listen(PORT, () => {console.log(`server start on port ${PORT}`);
});
// jsonp.html
// jsonp 的封装
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(cors());
app.use(bodyParser.json());// jsonp
app.get('/jsonp', (req, res) => {const cbname = req.query.callback || 'callback';const data = {msg: '来自服务器的消息',};res.set('content-type', 'application/javascript');res.end(`${cbname}(${JSON.stringify(data)})`);
});// proxy
app.get('/hero', async (req, res) => {const axios = require('axios');const resp = await axios.get('https://pvp.qq.com/web201605/js/herolist.json');// 使用CORS解决对代理服务器的跨域res.header('access-control-allow-origin', '*');res.send(resp.data);
});const PORT = 9527;app.listen(PORT, () => {console.log(`server start on port ${PORT}`);
});

2.3 代理

CORS和JSONP均要求服务器是「自己人」

那如果不是呢?

那就找一个中间人(代理)。

image-20230115133326930

3. 如何选择

保持生产环境和开发环境一致

image-20230115145335319

具体的几种场景:

image-20230115150610750

image-20230115151406797

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

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

相关文章

MyBatis无法读取XML中的Method的乌龙事件

事件背景 同事反馈,相同的jar包,在多人本地的电脑、多台服务器中,都是可以正常启动的,只有在其中一台服务器,简称它为A,无法启动,因为启动后的初始化操作中有一个调用mybatis方法的操作&#x…

oracle如果不适用toad或者plsql工具如何获取索引建表语句

select dbms_lob.substr(dbms_metadata.get_ddl(INDEX,INDEX_NAME,DIXON))||; from dba_indexes where ownerDIXON这个语句可以获取dixon用户的所有索引创建语句,sql脚本形式呈现 点开一个语句查看 如果不使用dbms_lob.substr这个函数最后得到是一个clob selec…

英国 AI 安全峰会前瞻:为什么是现在,为什么在英国

撰文:Ingrid Lunden 来源:TechCrunch 图片来源:由无界AI生成 人工智能的前景和危害是如今的热门话题。有人说人工智能将拯救我们,可以帮助诊断一些恶性疾病、弥补教育领域的数字鸿沟等。但也有人担心它在战争、安全、错误信息等方…

[学习笔记]python绘制图中图(绘制站点分布图)

背景 在绘制站点分布图时,有时需要采用图中图的方式,以便于在一张图中尽可能多的表达信息。此处记录一下利用python matplotlib绘制图中图的脚本,方便然后查询。 包含数据 该绘图脚本中包含以下数据: CMONOC站点分布&#xff…

Linux解决nvcc -V出现的-bash: nvcc command not found问题

两种解决办法: 1、第一种直接在bashrc文件中添加本地cuda路径: vim ~/.bashrc 定位到内容末尾,最末尾 添加命令: export LD_LIBRARY_PATH/usr/local/cuda/lib export PATH$PATH:/usr/local/cuda/bin添加后激活 source ~/.bashrc…

AI开源 - LangChain UI 之 Flowise

原文:AI开源 - LangChain UI 之 Flowise 一、Flowise 简介 Flowise 是一个为 LangChain 设计的用户界面(UI),使得使用 LangChain 变得更加容易(低代码模式)。 通过拖拽可视化的组件,组建工作流,就可以轻…

写出优美的代码:考虑使用静态工厂方法替代构造方法

文章目录 一、静态工厂方法区别于工厂方法模式二、静态工厂方法的优点1、有名字(1)优势(2)源码分析:BigInteger(3)源码分析:Executors(4)常用命名 名称 2、不…

苹果cms论坛多播放源自动采集在线影视网站

苹果 cms 论坛一个基于 vue 和 gin 实现的在线观影网站 项目采用 vite vue 作为前端技术栈, 使用 ElementPlus 作为 UI 框架进行开发 后端程序使用 Gin gorm go-redis 等相关框架提供接口服务, 使用 gocolly 和 robfig/cron 进行公共影视资源采集和定时更新功能 目前用户…

目前比较好用的护眼台灯?最好用的五款护眼台灯推荐

灯具可以说是我们日常生活中使用很频繁的工具了,我们每天都离不开它给我们带来的光亮。当然,现在灯具也有很多种类可以挑选,今天主要带来五款非常好用的护眼台灯指南。 1.书客护眼台灯Pro 使用体验分数:10分 亮点:具…

笔记:IDEA如何修改代码后,不重启服务器局部更新资源

前言 平常用IDEA开发网页写调样式和测功能最讨厌改一丁点东西就要重启整个服务器,所以本文主要就是解决此问题从而提高开发效率,避免浪费过多时间。 具体步骤 1、打开设置框 2、先新增exploded结尾的,并apply应用,把没有结尾的…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网:电信网络、有线电视网络、计算机网络 概念:把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义:计算机网络是将地理位置不同的独立计算机系统,通过传输介质链接起来&#xff0c…

HTML样式CSS、图像

HTML样式-CSS: CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。CSS可以通过以下方式添加到HTML中&#xff1a;1&#xff09;、内联方式&#xff1a;在HTML元素中使用“style”属性&#xff1b;2&#xff09;、内部样式表&#xff1a;在HTML文档头部<head>区…

阿里云OS系统Alibaba Cloud Linux 3系统的安全更新命令

给客户部署的服务&#xff0c;进入运维阶段&#xff0c;但是经常被客户监测到服务器漏洞&#xff0c;现在整理一下&#xff0c;服务器漏洞问题更新命令步骤。 服务器系统&#xff1a; 阿里云linux服务器&#xff1a;Alibaba Cloud Linux 3 漏洞类型和描述&#xff1a; #3214…

微课录屏软件哪个好?帮你轻松搞定课程录制

微课作为一种新型的教学方式&#xff0c;因其短小精悍、内容丰富等特点&#xff0c;越来越受到广大师生的喜爱。在制作微课时&#xff0c;选择一款合适的录屏软件显得尤为重要。可是微课录屏软件哪个好呢&#xff1f;本文将详细介绍两款微课录屏软件&#xff0c;并进行全方位对…

STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

STM32-HAL库08-TIM的输出比较模式&#xff08;输出PWM的另一种方式&#xff09; 一、所用材料&#xff1a; STM32F103C6T6最小系统板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 示波器或者逻辑分析仪 二、所学内容&#xff1a; 通过定时器TIM的输出比较模式得到预…

C++初阶(七)类和对象

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、流插入流提取1、流插入演示2、流提取演示3、cplusplus推荐 二、const成员三、取地址及con…

Go 如何实现并发

Go语言的并发机制是其强大和流行的一个关键特性之一。Go使用协程&#xff08;goroutines&#xff09;和通道&#xff08;channels&#xff09;来实现并发编程&#xff0c;这使得编写高效且可维护的并发代码变得相对容易。下面是Go的并发机制的详细介绍&#xff1a; 协程&#x…

指纹识别之dns

https://ephen.me/2017/dns-tcp/ https://c.biancheng.net/view/6457.html https://www.jianshu.com/p/b483300378af https://www.cnblogs.com/549294286/p/5172448.html wireshark数据包分析 Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包&#xff0c;…

循环神经网络 - RNN

循环神经网络&#xff08;Rerrent Neural Network,RNN&#xff09;是神经网络的一种&#xff0c;类似的还有深度神经网络&#xff08;DNN&#xff09;、卷积神经网路(CNN)、生成对抗网络&#xff08;GAN)等。**RNN对具有时序特性的数据非常有成效&#xff0c;他能挖掘数据中的时…

Asterisk Ubuntu 安装

更新环境 sudo apt update sudo apt install wget build-essential git autoconf subversion pkg-config libtool sudo contrib/scripts/get_mp3_source.sh A addons/mp3 A addons/mp3/common.c A addons/mp3/huffman.h A addons/mp3/tabinit.c A addons/mp3/Ma…