跨域:安全分步实施指南
什么是跨域问题?
跨域
(Cross-Origin Resource Sharing
,CORS
)问题发生在浏览器的同源策略
(Same-Origin Policy
)限制下。当一个域上的网页试图访问另一个域上的资源时,浏览器会阻止这些操作以保护用户的安全。这种限制包括但不限于 Ajax 请求、读取 Cookie 等。例如,位于 http://example.com
的网页试图发出一个 Ajax 请求到 http://api.example.com
的时候,就会遇到跨域问题。
同源策略
同源策略
是一种浏览器的安全机制,用于限制从一个源(域
、协议
、端口
)加载的脚本如何与来自另一个源的资源进行互动。具体来说,同源策略要求以下三个条件都相同:
- 协议(例如 http、https)
- 域名(例如 www.example.com)
- 端口(例如 80、443)
如果协议、域名或端口中的任何一个不同,就会被视为“跨源”。
为什么会有同源策略?
同源策略是为了防范恶意网站获取用户信息和不受信任的代码执行提供的一种安全机制。它阻止了某些攻击(如跨站脚本攻击)。
同源策略的重点在于:
- 保护用户数据安全,防止恶意网站获取用户信息。
- 防止跨站脚本攻击(XSS)和数据窃取。
解决跨域问题的几种方法
1. CORS(跨域资源共享)
最常见的解决跨域问题的方法是使用 CORS,它允许服务器端设置响应头,告诉浏览器允许跨源请求。
服务器端配置例子(使用 Flask):
from flask import Flask
from flask_cors import CORSapp = Flask(__name__)
CORS(app)@app.route("/example")
def example():return "Hello, World!"if __name__ == "__main__":app.run()
具体来说,CORS 通过 HTTP 头信息来开启浏览器的跨域请求权限,例如:
Access-Control-Allow-Origin
: 指定允许访问的域。Access-Control-Allow-Methods
: 指定允许的 HTTP 请求方法(如 GET, POST, PUT)。Access-Control-Allow-Headers
: 指定可以使用的自定义请求头。Access-Control-Allow-Credentials
: 是否允许发送 Cookie 等认证信息。
示例响应头:
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: GET,POST,PUT
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Credentials: true
2. JSONP (JSON with Padding)
JSONP 通过 <script>
标签不受同源策略限制的特点,实现跨域请求。它不是真正的 Ajax 请求,适用于 GET 请求。
前端示例:
<script>function handleResponse(data) {console.log(data);}
</script>
<script src="http://api.example.com/data?callback=handleResponse"></script>
服务器端返回示例(注意 JSONP 已不被推荐,具有安全风险):
handleResponse({ key: 'value' });
3. 服务器端代理
通过服务器端代理请求来解决跨域问题。前端发送请求到与其同源的服务器,服务器再向目标服务器发送请求并返回结果。
示例(使用 Node.js 和 Express):
const express = require('express');
const request = require('request');
const app = express();app.get('/api', (req, res) => {request('http://api.example.com/data', function (error, response, body) {if (error) {res.status(500).send(error);} else {res.send(body);}});
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
4. 同源策略配置
有时也可以通过适当地组织前端和后端的部署在同个域或子域下,从而避免跨域问题。
跨域问题与网关层
当在前后端之间引入一个网关层(例如 Kong),跨域问题的处理方式会有所变化。
演变情况:
- 网关层可以集中管理和转发请求,并作为一个中介处理跨域相关的设置。
- 网关层可以直接配置 CORS 头信息,统一管理来自不同前端的跨域请求,从而简化后端服务的配置工作。
1. 在网关层配置 CORS
通过在网关层(例如 Kong、Nginx)统一配置 CORS 相关的请求头,集中控制跨域策略。
Kong 配置示例:
# 启用CORS插件
curl -i -X POST http://localhost:8001/services/{service}/plugins \--data "name=cors" \--data "config.origins=http://example.com,http://another.com" \--data "config.methods=GET, POST, OPTIONS" \--data "config.headers=Accept,Authorization,Content-Type" \--data "config.exposed_headers=X-Total-Count" \--data "config.credentials=true" \--data "config.max_age=3600"
2. 使用反向代理解决跨域问题
网关(如 Kong 或 Nginx)可以作为反向代理,处理来自前端的请求并转发给后端服务,前端只需要与网关进行通信,避免了跨域问题。
Nginx 配置示例:
server {listen 80;server_name example.com;location /api/ {proxy_pass http://backend_service;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# 配置CORSlocation / {if ($request_method = OPTIONS) {add_header Access-Control-Allow-Origin "*";add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";add_header Access-Control-Allow-Headers "Authorization, Content-Type";add_header Content-Length 0;add_header Content-Type text/plain;return 204;}add_header Access-Control-Allow-Origin "*";add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";add_header Access-Control-Allow-Headers "Authorization, Content-Type";}
}
3. 服务网格架构
在微服务架构中可以使用服务网格(如 Istio)管理服务间通信,并在这里配置跨域策略,统一处理跨域请求。
Istio 配置 CORS:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: my-service
spec:hosts:- '*'gateways:- my-gatewayhttp:- match:- uri:prefix: /api/route:- destination:host: backend-serviceheaders:response:add:access-control-allow-origin: '*'access-control-allow-methods: 'OPTIONS, GET, POST, PUT, DELETE'access-control-allow-headers: 'Authorization, Content-Type'
最佳实践
安全第一
:严格设置Access-Control-Allow-Origin
头,只允许信任的域名访问,避免设置为*
。最小权限
:仅在需要的请求方法、请求头等上设置 CORS,最小化潜在的安全风险,避免过于宽泛的策略,如Access-Control-Allow-Origin: *
。认证处理
:确保在 CORS 中正确处理Access-Control-Allow-Credentials
和 Cookie 传递,以防止 CSRF 攻击。监控和日志
:记录跨域请求日志以便审计和问题排查,监控不正常的跨域请求行为。集中管理
:在一个统一的网关层配置跨域策略,提高管理效率,降低复杂度。
结语
在前后端分离的 Web 服务架构中,跨域问题是一个常见的问题。通过在网关层集中管理跨域配置,可以有效地简化跨域问题的处理,同时确保系统安全和灵活性。
- 专栏:「计算通践」
相关文章:

跨域:安全分步实施指南
什么是跨域问题? 跨域(Cross-Origin Resource Sharing,CORS)问题发生在浏览器的同源策略(Same-Origin Policy)限制下。当一个域上的网页试图访问另一个域上的资源时,浏览器会阻止这些操作以保护…...

【iOS】AutoreleasePool自动释放池的实现原理
目录 ARC与MRC项目中的main函数自动释放池autoreleasepool {}实现原理AutoreleasePoolPage总结 objc_autoreleasePoolPush的源码分析autoreleaseNewPageautoreleaseFullPageautoreleaseNoPage autoreleaseFast总结 autorelease方法源码分析objc_autoreleasePoolPop的源码分析po…...

stm32—GPIO
0. 引入 在单片机产品中,我们常常可以见到三种模块:LCD灯、KEY按键、BEEP蜂鸣器 LED灯: 一个比较常见的LED电路LED0 ---------- 通过控制LED0引脚(电线) 给它一个低电平(低电压),LED灯就会亮 给它一个高电平(高电压),LED灯就会灭 …...

CocosCreator使用 ProtoBuf WebSocket与服务器对接方法
在 Cocos Creator 中使用 .proto 文件和转换成 TypeScript(TS)两者各有其优缺点,具体选择取决于你的项目需求和团队的开发习惯。以下是两者的一些比较: 1、使用 .proto 文件的优点: 跨语言支持:Protocol B…...

【python基础】while循环语句练习
明显可以感觉到循环比判断要更加难以理解一些,这个就只能通过练习来提高理解和思维能力了。 学习视频:第一阶段-第四章-05-while循环案例-九九乘法表_哔哩哔哩_bilibili 练习一:计算1-10的和 i1#循环的起始值 sum0 while i&l…...

【SpringBoot系列】WebMvcConfigurer配置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

学懂C++ (十九):高级教程——深入详解C++信号处理
目录 C中的信号处理 1. 信号处理的本质 2. 主要信号类型 3. 核心关键点 4. 经典实例 代码分析 5. 进阶:信号屏蔽与多线程 例子:使用sigaction() 6. Windows中的信号处理 7. 比较与总结 示例:Windows控制台事件处理 总结 C中的信号…...

SOMEIP_ETS_032:echoUINT8ArrayMinSize
测试目的: 确保DUT能够正确处理最小尺寸的UINT8数组参数,并且在发送和接收过程中保持参数值和顺序不变。 描述 本测试用例旨在验证DUT在处理包含最小尺寸UINT8数组参数的SOME/IP消息时,是否能够准确地发送和接收这些参数,确保返…...

JS+CSS案例:可适应上下布局和左右布局的菜单(含二级菜单)
今天,我给大家分享一个原创的CSS菜单,整个菜单全由CSS写成,仅在切换布局时使用JS。合不合意,先看看效果图。 本例图片 接下来,我来详细给大家分享它的制作方法。 文件夹结构 因为涉及到了样式表切换,所以,你需要借鉴一下我的文件夹结构。 CSS文件夹: reset.css 用于…...

【数据结构】线性表,顺序表
一. 线性表 1. 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 2. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 3. 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理…...

Spring之最基础的创建与Bean的存储与获取(还有Maven加载jar包报错的解决方法)
目录 创建Spring项目 如何解决Maven加载jar包报错 存储Bean和取Bean 在Java中对象也称为Bean。所以后面我提到Bean,大家要知道我说的是什么。 创建Spring项目 我的idea是2022版本的,如果大家和我一样可以参考我的。 1.创建一个Maven项目。图片上忘了…...

RabbitMQ应用问题 - 消息顺序性保证、消息积压问题
文章目录 MQ 消息顺序性保证概述原因分析解决方案基于 spring-cloud-stream 实现分区消费 消息挤压问题概述原因分析解决方案 MQ 消息顺序性保证 概述 a)消息顺序性:消费者消费的消息的顺序 和 生产者发送消息的顺序是一致的. 例如 生产者 发送消息顺序…...

linux tcp通讯demo
linux tcp通讯demo代码。通过用chatgpt生成的代码。做一个代码记录。 一、基本的通讯demo server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h>…...

在 MongoDB 中,如何配置副本集以实现读写分离?
在 MongoDB 中,配置副本集以实现读写分离主要涉及以下几个步骤: 初始化副本集: 创建副本集时,需要在所有参与节点上运行 rs.initiate() 命令。这将初始化一个新的副本集。 添加成员到副本集: 使用 rs.add() 命令将所有…...

虚拟dom-Diff算法
虚拟dom-Diff算法 vue2 diff算法在vue2中就是patch,通过新旧虚拟dom对比,找到最小变化然后进行dom操作 在页面首次渲染的时候会调用一次patch并创建新的vnode,不会进行深层次的比较,然后再组件中数据发生变化的时候,…...

01创建型设计模式——单例模式
一、单例模式简介 单例模式(Singleton Pattern)是一种创建型设计模式(GoF书中解释创建型设计模式:一种用来处理对象的创建过程的模式),单例模式是其中的一种,它确保一个类只有一个实例ÿ…...

图像分割(一)
一、概述 语义分割:是把每个像素都打上标签(这个像素点是人、树、背景等) 实例分割:不光要区别类别,还要区分类别中的每一个个体 损失函数:逐像素的交叉熵;样本均衡问题 MIOU指标:…...

C++ 新经典:设计模式 目录(先留框架,慢慢来~)
C 新经典:设计模式 C 新经典:设计模式 C 新经典:设计模式第1章 设计模式与软件开发思想、编程环境介绍第2章 模板方法模式第3章 工厂模式、原型模式、建造者模式第4章 策略模式第5章 观察者模式第6章 装饰模式第7章 单件模式第8章 外观模式第…...

go之命令行工具urfave-cli
一、urfave/cli urfave/cli 是一个声明性的、简单、快速且有趣的包,用于用 Go 构建命令行工具。 二、快速使用 2.1 引入依赖 go get github.com/urfave/cli/v2 2.2 demo package mainimport ("fmt""log""os""github.com/ur…...

四种应用层协议——MQTT、CoAP、WebSockets和HTTP——在工业物联网监控系统中的性能比较
目录 摘要(Abstract) 实验设置 实验结果 节选自《A Comparative Analysis of Application Layer Protocols within an Industrial Internet of Things Monitoring System》,作者是 Jurgen Aquilina、Peter Albert Xuereb、Emmanuel Francalanza、Jasmine Mallia …...

MySQL的脏读、不可重复读、幻读与隔离级别
脏读/不可重复读/幻读 脏读 脏读(Dirty Read)发生在一个事务读取了另一个事务尚未提交的数据。如果第二个事务失败并回滚,第一个事务读到的数据就是错误的。这意味着数据从一开始就是不稳定或者“脏”的。 举例 事务A读取了某条记录的值为X。事务B修改该记录的值…...

程序员前端开发者的AI绘画副业之路:在裁员危机中寻找新机遇
正文: 在这个充满变数的时代,作为一名前端开发者,我经历了行业的起伏,见证了裁员危机和中年失业危机的残酷。在这样的背景下,我开始了利用AI绘画作为副业的探索,不仅为了寻求经济上的稳定,更是为…...

Burp Suite的使用和文件上传漏洞靶场试验
第一步:分析如何利用漏洞,通过对代码的查阅发现,代码的逻辑是先上传后删除,意味着,我可以利用webshell.php文件在上传到删除之间的间隙,执行webshell.php的代码,给上级目录创建一个shell.php木马…...

如何在Ubuntu中安装deepin wine版的企业微信
如何在Ubuntu中安装deepin wine版的企业微信 运行如下一条命令将移植仓库添加到系统中 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh自此以后,你可以像对待普通的软件包一样,使用apt-get系列命令进行各种应用安装、更新和卸载清理了。 安装企业…...

案例:Nginx + Tomcat集群(负载均衡 动静分离)
目录 案例 案例环境 案例步骤 部署Tomcat服务器 部署Nginx服务器 实现负载均衡和读写分离 日志控制 案例 案例环境 操作系统 IP 地址 角色 CentOS 192.168.10.101 Nginx服务器(调度器) CentOS 192.168.10.102 Tomcat服务器① CentOS 1…...
【密码学】密码协议的分类:②认证协议
密码协议的分类有很多种方式,这里我采取的是基于协议实现的目的来分类。可以将密码协议分成三类:认证协议、密钥建立协议、认证密钥建立协议。 一、认证协议是什么? 认证协议都在认证些什么东西呢?认证一般要认证三个东西&#x…...

异步编程(Promise详解)
目录 异步编程 回调函数 回调地狱 Promise 基本概念 Promise的特点 1.Promise是一种构造函数 2.Promise接收函数创建实例 3.Promise对象有三种状态 4.Promise状态转变不可逆 5.Promise 实例创建即执行 6.Promise可注册处理函数 7.Promise支持链式调用 Promise的静…...

DjangoORM注入分享
DjangoORM注入 简介 这篇文章中,分享一些关于django orm相关的技术积累和如果orm注入相关的安全问题讨论。 攻击效果同数据库注入 从Django-Orm开始 开发角度 Django ORM(Object-Relational Mapping)是Django框架中用于处理数…...

【HBZ分享】Redis各种类型的数据结构应用场景
String(字符串类型) 计数器: incr / decr, 比如商品库存,业务号的发号器业务数据key-value缓存, 缓存结果数据,提高网站性能,缓解DB压力分布式session会话, 集群环境下存储token鉴权信息分布式锁ÿ…...

anaconda创建并且配置pytorch(完整版)
📚博客主页:knighthood2001 ✨公众号:认知up吧 ** 🎃知识星球:【认知up吧|成长|副业】介绍** ❤️如遇文章付费,可先看看我公众号中是否发布免费文章❤️ 🙏笔者水平有限,欢迎各位大…...