当前位置: 首页 > news >正文

跨域问题讨论

问题

跨域定义

当一个请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域

跨域的安全隐患(CSRF攻击)

在这里插入图片描述

也就是说,一旦允许跨域,意味着允许恶意网站随意攻击可信网站,带来安全风险。

这里面有一个前提:

用户必须先登录可信站点A才行(登录cookie会保存在客户本地)。

解决方案

SOP策略

SOP:same-origin policy,同源策略

现代浏览器默认遵循同源策略,即网站A的请求不能去访问网站B。

但,<img>、<iframe>、<script>、<link>、<video>、<audio>等标签不受同源策略约束,这些标签可以通过src属性请求到其他服务器上的数据;如<img>的src(获取图片),<script>的src(获取javascript),iframe更是把不同网站的前端页面无缝衔接起来的常用技巧。

所以,即使在浏览器支持SOP的情况下,前例中的恶意网站仍可以构造例如img src这样的恶意代码,绕过浏览器的SOP规则,访问正常网站A。

不受SOP限制的资源清单:
脚本文件 js
图片资源
样式资源css
iframe展示其他的的资源
a链接访问其他资源
多媒体等资源
form表单提交

受SOP限制的资源清单:
跨域的XHR请求
iframe可以访问iframe整体,不能访问内容
cookie的限制,使用CORS需要withCredentials=true才可以带上cookie,否则cookie都没法带。

CORS机制

SOP原则可防范跨域,但如果确有需要跨域,如何安全的进行呢?

W3C推荐了一种跨域的访问验证的机制,即CORS(Cross-Origin Resource Sharing 跨源资源共享)。

这种机制让Web应用服务器能支持跨域访问,减轻跨域请求的风险。 CORS验证机制需要客户端和服务端协同处理。

CORS原理具体可参考这里。

写得非常详细,我们可以概况为:为支持CORS,浏览器为我们的跨站XHR请求自动加了一个额外的请求头Origin,记录原始站点O,询问后台是否允许跨域(复杂请求会先自动通过OPTIONS请求专门询问一次,简单请求就没有提前的OPTIONS询问了),后台在响应头里返回关键字段Access-Control-Allow-Origin,给出允许跨域的网址P。浏览器将P跟O匹配,匹配上了,就可以继续访问,匹配不上就报错。若响应头里没有Access-Control-Allow-Origin字段,说明后台就不接受跨域XHR请求,浏览器会报:

No 'Access-Control-Allow-Origin' header is present on the requested resource

观察下来,对于简单请求(例如GET),实际运行中,浏览器其实是调了后台服务的,只不过后台服务没返回Access-Control-Allow-Origin,浏览器直接把结果扔了,对调用者报了这个错。对于POST请求,因为我们一般都是传的json,算复杂请求,会自动触发OPTIONS询问,就不会真正调用到后台服务的业务处理里了。

顺带说一下,域内请求,就没有Origin字段了,后台去拿,也只能拿到null或空。另外,因为CORS安全约束,请求头里的Origin字段是浏览器自动设置的,程序是无法强改的(能改的话,CORS机制就形同虚设了)。

由于浏览器侧是自动处理的,我们主要看后台的代码处理,以flask为例 :

@app.route('/repair_plans/page/<int:page_size>/<int:cur_page>')
def query_data(page_size, cur_page):app.logger.info('size:%d, cur_page:%d' % (page_size, cur_page))res =  jsonify(pageVO = {'totalRows':1},result = [])res.headers['Access-Control-Allow-Origin'] = request.headers.get('Origin')res.headers['Access-Control-Allow-Methods'] = 'GET'res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'return res

逻辑很简单,把Access-Control-Allow-Origin等几个CORS相关的响应头补上去即可。这里说明一下,Access-Control-Allow-Origin可以指定是原始站点O,也可以是一个预置的合法站点,一般不建议用星号通配符。若该字段设置为None或空,前端的跨域XHR请求就会报错:

The 'Access-Control-Allow-Origin' header contains the invalid value 'None'.

csrf token

准确的讲,CORS是跨域访问的例外规范,而非跨域攻击的防范。

跨域攻击的防范,首先还是浏览器的SOP策略,但前面说了,SOP有例外,像img src、链接、表单提交等都可以绕过SOP,浏览器不会报错,且这些做法的请求头里都没有Origin字段,后台只能通过检查referer字段来防范。但referer字段是可以在浏览器里配置不发送的(出于隐私保护的考虑)。最后,即便浏览器支持,你也不知道这个浏览器是否因安全漏洞被攻陷,导致referer可被篡改,所以还需要一个更强的防范措施,这就是csrf token。

用户登录后,随机生成csrf_token,用户在做核心操作表单提交(POST)时必须在请求头里携带csrf_token,并且在服务端校验csrf_token的合法性。由于恶意站点是无法构造CSRF Token的(只有登陆可信站点才能获取到,且CSRF Token一般不放在cookie中),因此CSRF Token是目前最成熟、使用最广泛的方法。
这是SO上的一段说明,印证了本节的说法:

Origin vs Referer vs CSRF token
Most likely, the reason OWASP recommends also using a CSRF token, is that at the time when this recommendation was made - a significant portion of browsers did not yet support the Origin header. This is no longer the case, but people are chimpanzees.In order to preserve privacy, any browser request can decide to omit the Referer header. So it is probably best to only check the Origin header. (In case you want to allow for users to preserve their privacy)The Origin header is null in some cases. Note that all of these requests are GET requests, which means they should not have any side effects.As long as you make sure the malicious website sending the requests with your browser cannot read the responses, you should be fine. This can be ensured using proper CORS headers. (Do not use Access-Control-Allow-Origin: *!)To prevent "click-jacking", set the header X-Frame-Options: DENY. This will tell your browser that it is not allowed to display any part of your website in an iframe.

大意是说,referer、Origin不是万无一失的,最好补充上csrf token。

反向代理

参见这里。

这里把对网站A和B的访问都集中到nginx处,天然回避了跨域(比如,A访问B)的问题。

相关文章:

跨域问题讨论

问题 跨域定义 当一个请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。 跨域的安全隐患&#xff08;CSRF攻击&#xff09; 也就是说&#xff0c;一旦允许跨域&#xff0c;意味着允许恶意网站随意攻击可信网站&#xff0c;带来安全风险。 这里面有一…...

ESP32设备通信-两个ESP32设备之间HTTP通信

两个ESP32设备之间HTTP通信 文章目录 两个ESP32设备之间HTTP通信1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 ESP32服务器节点代码4.2 ESP32客户端节点代码在本文中,我们将介绍如何在没有任何物理路由器或互联网连接的情况下使用 Wi-Fi 在两个 ESP32 开发板之间执行无线…...

数据结构学习笔记——查找算法中的树形查找(平衡二叉树)

目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造&#xff08;一&#xff09;LL型旋转&#xff08;二&#xff09;LR型旋转&#xff08;三&#xff09;RR型旋转&#xff08;四&#xff09;RL型旋转 四、平衡二叉树的删除&#xff08;一&#xff09;叶子结点&a…...

P1830 轰炸III

题目背景 一个大小为 &#xfffd;&#xfffd;nm 的城市遭到了 &#xfffd;x 次轰炸&#xff0c;每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后&#xff0c;有 &#xfffd;y 个关键点&#xff0c;指挥官想知道&#xff0c;它们有没有受到过轰炸&#xff0c;如…...

大语言模型LLM知多少?

你知道哪些流行的大语言模型?你都体验过哪写? GPT-4,Llamma2, T5, BERT 还是 BART? 1.GPT-4 1.1.GPT-4 模型介绍 GPT-4(Generative Pre-trained Transformer 4)是由OpenAI开发的一种大型语言模型。GPT-4是前作GPT系列模型的进一步改进,旨在提高语言理解和生成的能力,…...

Redis命令行使用Lua脚本

Redis命令行使用Lua脚本 Lua脚本在Redis中的使用非常有用&#xff0c;它允许你在Redis服务器上执行自定义脚本&#xff0c;可以用于复杂的数据处理、原子性操作和执行多个Redis命令。以下是Lua脚本在Redis中的基本使用详细讲解&#xff1a; 运行Lua脚本&#xff1a; 在Redis中…...

HTML详细基础(三)表单控件

本帖介绍web开发中非常核心的标签——表格标签。 在日常我们使用到的各种需要输入用户信息的场景——如下图&#xff0c;均是通过表格标签table创造出来的&#xff1a; 目录 一.表格标签 二.表格属性 三.合并单元格 四.无序列表 五.有序列表 六.自定义标签 七.表单域 …...

map和set的具体用法 【C++】

文章目录 关联式容器键值对setset的定义方式set的使用 multisetmapmap的定义方式insertfinderase[]运算符重载map的迭代器遍历 multimap 关联式容器 关联式容器里面存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。比如&#xff1a;set…...

聚合统一,SpringBoot实现全局响应和全局异常处理

目录 前言 全局响应 数据规范 状态码(错误码) 全局响应类 使用 优化 全局异常处理 为什么需要全局异常处理 业务异常类 全局捕获 使用 优化 总结 前言 在悦享校园1.0版本中的数据返回采用了以Map对象返回的方式&#xff0c;虽然较为便捷但也带来一些问题。一是在…...

【C/C++笔试练习】——数组名和数组名、switch循环语句、数据在计算机中的存储顺序、字符串中找出连续最长的数字串、数组中出现次数超过一半的数字

文章目录 C/C笔试练习1.数组名和&数组名&#xff08;1&#xff09;数组名和&数组名的差异&#xff08;2&#xff09;理解数组名和指针偏移&#xff08;3&#xff09;理解数组名代表的含义&#xff08;4&#xff09;理解数组名代表的含义 2.switch循环语句&#xff08;6…...

力扣每日一题(+日常水题|树型dp)

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 简单分析一下: 每一个数字其实只有2个状态选 or 不 可得预处理每一个数初始状态(不选为0,选为所有x的个数 * x)累加即可 for(auto &x : nums)dp[x][1] x;每选一个树 i 删去 i 1 和 i - 1 故我们可以将 i…...

使用perming加速训练可预测的模型

监督学习模型的训练流程 perming是一个主要在支持CUDA加速的Windows操作系统上架构的机器学习算法&#xff0c;基于感知机模型来解决分布在欧式空间中线性不可分数据集的解决方案&#xff0c;是基于PyTorch中预定义的可调用函数&#xff0c;设计的一个面向大规模结构化数据集的…...

【数据库】存储引擎InnoDB、MyISAM、关系型数据库和非关系型数据库、如何执行一条SQL等重点知识汇总

目录 存储引擎InnoDB、MyISAM的适用场景 关系型和非关系型数据库的区别 MySQL如何执行一条SQL的 存储引擎InnoDB、MyISAM的适用场景 InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;只有在需要它不支持的特性时&#xff0c;才考虑使用其它存储引擎。实现了四个标准的隔…...

车道线分割检测

利用opencv&#xff0c;使用边缘检测、全局变化梯度阈值过滤、算子角度过滤、HLS阈值过滤的方法进行车道线分割检测&#xff0c;综合多种阈值过滤进行检测提高检测精度。 1.利用cv2.Sobel()计算图像梯度(边缘检测) import cv2 import numpy as np import matplotlib.pyplot a…...

树莓集团又一力作,打造天府蜂巢成都直播产业园样板工程

树莓集团再次推出惊艳之作&#xff0c;以打造成都天府蜂巢直播产业园为目标。该基地将充分展现成都直播产业园的巨大潜力与无限魅力&#xff0c;成为一个真正的产业园样板工程。 强强联手 打造未来 成都天府蜂巢直播产业园位于成都科学城兴隆湖高新技术服务产业园内&#xff0…...

ubuntu 软件包管理之二制作升级包

Deb 包(Debian 软件包)是一种用于在 Debian 及其衍生发行版(例如 Ubuntu)中分发和安装软件的标准包装格式。它们构成了 Debian Linux 发行版中的软件包管理系统的核心组成部分,旨在简化软件的分发、安装、更新和卸载流程。在本篇文章中,我们将深入探讨以下内容: Deb 包基…...

TCP/IP网络江湖——数据链路层的防御招式(数据链路层下篇:数据链路层的安全问题)

目录 引言 一、 数据链路层的隐私与保密 二、数据链路层的安全协议与加密...

ios项目安装hermes-engine太慢问题

问题说明 ios工程&#xff0c;在使用"pod install"安装依赖的时候&#xff0c;由于超时总是报错 $ pod install ... Installing hermes-engine (0.71.11)[!] Error installing hermes-engine [!] /usr/bin/curl -f -L -o /var/folders/4c/slcchpy55s53ysmz_1_q_gzw…...

构建个人云存储:本地电脑搭建SFTP服务器,开启公网访问,轻松共享与管理个人文件!

本地电脑搭建SFTP服务器&#xff0c;并实现公网访问 文章目录 本地电脑搭建SFTP服务器&#xff0c;并实现公网访问1. 搭建SFTP服务器1.1 下载 freesshd 服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2. 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内…...

springboot 下载文件为excel数据,中文自定义单元格宽度

/**2 * Description:表格自适应宽度(中文支持)3 * Author: 4 * param sheet sheet5 * param columnLength 列数6 */7 private static void setSizeColumn(HSSFSheet sheet, int columnLength) {8 for (int columnNum 0; columnNum < …...

机器学习 面试/笔试题

1. 生成模型 VS 判别模型 生成模型&#xff1a; 由数据学得联合概率分布函数 P ( X , Y ) P(X,Y) P(X,Y),求出条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X)的预测模型。 朴素贝叶斯、隐马尔可夫模型、高斯混合模型、文档主题生成模型&#xff08;LDA&#xff09;、限制玻尔兹曼机…...

某企查ymg_ssr列表详情

js篇— 今天来看下某企查的列表详情–侵删 header发现这个参数 先断点一下 然后上一步 就到了这个地方 就开始扣一下这个js 三大段&#xff0c;先不解混淆了&#xff0c; 给a粘贴出来 &#xff0c;去掉自执行 给结果稍微改一下 缺windows&#xff0c;开始补环境 直接上…...

使用YOLOv5的backbone网络识别图像天气 - P9

目录 环境步骤环境设置包引用声明一个全局的设备 数据准备收集数据集信息构建数据集在数据集中读取分类名称划分训练、测试数据集数据集划分批次 模型设计编写维持卷积前后图像大小不变的padding计算函数编写YOLOv5中使用的卷积模块编写YOLOv5中使用的Bottleneck模块编写YOLOv5…...

TikTok海外扩张:亚马逊的新对手崛起

随着社交媒体和电子商务的融合&#xff0c;TikTok正迅速崭露头角&#xff0c;成为亚马逊等传统电商巨头的潜在竞争对手。这一新兴平台的快速发展引发了广泛的关注&#xff0c;特别是在全球范围内。 在这篇文章中&#xff0c;我们将探讨TikTok海外扩张的战略&#xff0c;以及它…...

CSS详细基础(五)选择器的优先级

本节介绍选择器优先级&#xff0c;优先级决定了元素最终展示的样式~ 浏览器是通过判断CSS优先级&#xff0c;来决定到底哪些属性值是与元素最为相关的&#xff0c;从而作用到该元素上。CSS选择器的合理组成规则决定了优先级&#xff0c;我们也常常用选择器优先级来合理控制元素…...

LLM-TAP随笔——有监督微调【深度学习】【PyTorch】【LLM】

文章目录 5、 有监督微调5.1、提示学习&语境学习5.2、高效微调5.3、模型上下文窗口扩展5.4、指令数据构建5.5、开源指令数据集 5、 有监督微调 5.1、提示学习&语境学习 提示学习 完成预测的三个阶段&#xff1a;提示添加、答案搜索、答案映射 提示添加 “[X] 我感到…...

kafka伪集群部署,使用docker环境拷贝模式

线上启动容器的方式是复制容器的运行环境出来&#xff0c;然后进行运行脚本的形式 1&#xff1a;在home/kafka目录下创建如下目录 2&#xff1a;复制kafka1容器内的数据/bitnami/kafka/data&#xff0c;直接放在1992_data里面&#xff0c;同理,复制kafka2容器内的数据/bitnami/…...

工业交换机一般的价格是多少呢?

工业交换机是一种应用于工业领域的网络设备。它的性能和所有安全指标都比一般商业交换机更加稳定。所以&#xff0c;工业级交换机的价格相对于普通的交换机要稍稍昂贵一些。工业交换机一般的价格是多少呢&#xff1f;每个厂家的交换机价格是不是都一样呢&#xff1f; 首先&…...

QT使用前的知识

QT使用前的知识 常用的快捷键 源文件的内容解释 .pro文件的解释 头文件的解释 构建新的对象—组成对象树 槽函数 自定的信号和槽 槽函数的信号是一个重载函数时 电机按钮触发信号 调用无参数的信号 断开信号...

Unity制作旋转光束

Unity制作旋转光束 大家好&#xff0c;我是阿赵。 这是一个在很多游戏里面可能都看到过的效果&#xff0c;在传送门、魔法阵、角色等脚底下往上散发出一束拉丝形状的光&#xff0c;然后在不停的旋转。 这次来在Unity引擎里面做一下这种效果。 一、准备材料 需要准备的素材很简…...

手机网站优化指南/优秀营销软文范例300字

C# 中一切都是对象&#xff0c;对于文件操作&#xff0c;主要有两个静态类&#xff0c;分别是&#xff1a;File 和 Directory。 1. File 操作文件&#xff0c;静态类&#xff0c;对文件进行操作。拷贝、删除、剪切&#xff1b;2. Directory 操作目录&#xff08;文件夹&#…...

花木网站模版/永久免费个人网站申请注册

1 FFmpeg录屏以及录音的命令 最近需要用到FFmpeg录制声卡中的声音&#xff0c;在cmd.exe的命令行中使用正常的录音命令&#xff1a; ffmpeg -f dshow -i audio"virtual-audio-capturer" -acodec aac f:\temp.aac是可以实现录制的 然后按照官方的按Q键暂停录制 也…...

何为网站开发/seo优化推广流程

1&#xff0e;系统崩溃会让工作中断&#xff0c;有时会中断几个小时各种各样的病毒感染、系统故障、硬盘损坏会导致工作系统崩溃。 不得不中断工作 我们要花费很长时间来恢复系统。 1、如果是重新安装&#xff0c;那可能需要花费几个小时的时间。 2、即使是有系统恢复软件帮助&…...

怎样建设卡盟网站/网页优化方案

今日通过&#xff1a;13 通过题目编号&#xff1a;1107/1112/1114/1115/1116/1120/1123/1127/1128/1009/1035/1045/1089 任务完成率&#xff1a;75% 预计完成需要时间&#xff1a;2天 预计达到第二名时间&#xff1a;1-2天转载于:https://www.cnblogs.com/wangximing/p/1105562…...

乌鲁木齐公司网站建设/百度热线客服24小时

学生成绩表(stuscore)&#xff1a; 姓名&#xff1a;name 课程&#xff1a;subject 分数&#xff1a;score 学号&#xff1a;stuid 张三 数学 89 1 张三 语文 80 1 张三 英语 70 1 李四 数学 90 2 李四 语文 70 2 李四 英语 80 2 创建表SET ANSI_NU…...

个体工商户做网站/seo专员是什么意思

按照先后顺序&#xff1a;1&#xff0c;静态先于非静态代码库执行&#xff08;静态代码块随着类的加载而加载&#xff0c;初始化只执行一次&#xff09;2&#xff0c;父类先于子类3&#xff0c;非静态代码块优于构造函数执行所以执行顺序如下&#xff1a;父类&#xff22;静态代…...