跨域:安全分步实施指南
什么是跨域问题?
跨域
(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 …...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...