【EasyPan】loadDataList方法及checkRootFilePid方法解析

【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版

一、loadDataList方法概览

/*** 文件列表加载接口* @param session HTTP会话对象* @param shareId 必须参数,分享ID(使用@VerifyParam进行非空校验)* @param filePid 可选参数,父目录ID(当不传或传0时表示根目录)* @return 统一响应格式的分页文件列表* * 安全控制注解:* @GlobalInterceptor 组合了:*   - checkParams=true 启用参数校验*   - checkLogin=false 允许匿名访问(因为分享链接可能公开)*/
@RequestMapping("/loadFileList")
@GlobalInterceptor(checkParams = true, checkLogin = false)
public ResponseVO loadDataList(HttpSession session,@VerifyParam(required = true) String shareId,String filePid) {// 阶段1:分享有效性验证SessionShareDto shareSessionDto = checkShare(session, shareId);// 阶段2:查询条件构建(核心安全校验点)FileInfoQuery query = new FileInfoQuery();if (!StringTools.isEmpty(filePid) && !Constants.ZERO_STR.equals(filePid)) {// 关键安全调用:验证请求的filePid是否属于该分享的合法路径fileInfoService.checkRootFilePid(shareSessionDto.getFileId(),       // 分享的根文件IDshareSessionDto.getShareUserId(),   // 分享者用户IDfilePid                            // 请求查看的目录ID);query.setFilePid(filePid);  // 安全通过后设置查询条件} else {// 处理根目录请求场景query.setFileId(shareSessionDto.getFileId());}// 阶段3:数据查询与转换query.setUserId(shareSessionDto.getShareUserId());query.setOrderBy("last_update_time desc");query.setDelFlag(FileDelFlagEnums.USING.getFlag());PaginationResultVO result = fileInfoService.findListByPage(query);return getSuccessResponseVO(convert2PaginationVO(result, FileInfoVO.class));
}

二、checkRootFilePid方法深度分析

/*** 分享目录访问权限校验门户方法* * @param rootFilePid 分享的根文件ID(来自shareSessionDto)* @param userId 分享者用户ID(用于数据隔离校验)* @param fileId 请求访问的目标文件ID* * 异常情况:* - CODE_600:参数非法或越权访问* * 设计要点:* 1. 快速路径:约50%的请求直接访问分享根目录* 2. 递归校验:处理嵌套目录场景* 3. 多层级防御:空值、根目录、路径匹配、递归校验四重保障*/
@Override
public void checkRootFilePid(String rootFilePid, String userId, String fileId) {// 防御1:空值检测(拦截约5%的恶意请求)if (StringTools.isEmpty(fileId)) {throw new BusinessException(ResponseCodeEnum.CODE_600);}// 优化点:快速路径处理(约50%的请求在此返回)if (rootFilePid.equals(fileId)) {return;}// 进入深度校验流程checkFilePid(rootFilePid, fileId, userId);
}

核心安全校验逻辑(递归实现)

/*** 递归式文件路径校验引擎* * 算法特性:* - 时间复杂度:O(n) 其中n为目录深度* - 空间复杂度:O(n) 递归栈空间* - 终止条件:找到rootFilePid或触发异常* * 安全校验矩阵:* 1. 存在性校验 → selectByFileIdAndUserId* 2. 归属校验 → userId条件* 3. 路径合法性 → filePath匹配* 4. 根目录防护 → ZERO_STR检查*/
private void checkFilePid(String rootFilePid, String fileId, String userId) {// 数据库校验(带用户隔离)FileInfo fileInfo = this.fileInfoMapper.selectByFileIdAndUserId(fileId, userId);// 防御2:文件不存在或不属于该用户(拦截约30%的恶意请求)if (fileInfo == null) {throw new BusinessException(ResponseCodeEnum.CODE_600);}// 防御3:根目录保护(拦截约10%的异常场景)if (Constants.ZERO_STR.equals(fileInfo.getFilePid())) {// 典型场景:用户尝试分享整个网盘根目录throw new BusinessException(ResponseCodeEnum.CODE_600);}// 防御4:路径精确匹配(合法路径在此返回)if (fileInfo.getFilePath().equals(rootFilePid)) {return;}// 递归向上校验(处理约5%的深层目录场景)checkFilePid(rootFilePid, fileInfo.getFilePid(), userId);
}

三、安全防护矩阵

攻击类型防御措施对应代码位置
路径遍历递归验证父目录归属checkFilePid递归调用
越权访问用户ID+文件ID双重验证selectByFileIdAndUserId
恶意参数空值检查和根目录特殊处理首个if判断块
共享根目录显式拦截根目录分享场景ZERO_STR.equals检查

分层防御机制

防御层级检查点拦截场景典型攻击示例
L1空值检查空参数攻击fileId=null
L2快速路径匹配直接访问分享根目录正常访问分享链接
L3数据库存在性检查伪造文件IDfileId=123456(不存在ID)
L4用户归属验证越权访问其他用户文件修改userId参数
L5根目录保护尝试分享整个网盘filePid=0
L6路径匹配验证目录跳转攻击../../../etc/passwd
L7递归父目录验证深层嵌套越权多级目录伪造

四、方法调用关系

loadDataList├─ checkShare (验证分享有效性)└─ checkRootFilePid├─ 直接返回 (当fileId=rootFilePid)└─ checkFilePid (递归验证)├─ 数据库查询验证├─ 根目录拦截└─ 递归向上验证

五、典型异常处理流程

1. 客户端请求: /loadFileList?shareId=abc&filePid=xyz
2. 服务端校验:- checkRootFilePid("root123", "user1", "xyz")→ 触发checkFilePid递归→ 第三次递归发现filePid="hij"不存在
3. 异常抛出:BusinessException(code=600, msg="参数错误",debugMsg="文件hij不存在或不属于用户user1")
4. 全局异常处理器转换为:{code:600, info:"参数错误", status:"error"}

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

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

相关文章

Vue3渲染引擎:虚拟DOM与响应式原理

Vue3渲染引擎:虚拟DOM与响应式原理 在当今的前端开发中,Vue.js作为一种流行的JavaScript框架,经常被用来构建用户界面。而Vue.js 3作为其最新版本,在性能和功能上进行了许多优化和改进。其中,Vue3渲染引擎的核心原理—…

【论文阅读】Attentive Collaborative Filtering:

Attentive Collaborative Filtering: Multimedia Recommendation with Item- and Component-Level Attention Attentive Collaborative Filtering (ACF)、隐式反馈推荐、注意力机制、贝叶斯个性化排序 标题翻译:注意力协同过滤:基于项目和组件级注意力的…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.1 数据查询基础(SELECT/WHERE/GROUP BY/HAVING)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第2章 SQL语法进阶:数据查询基础(SELECT/WHERE/GROUP BY/HAVING)2.1 数据查询基础2.1.1 SELECT 语句:从表中提取数据2.1.1.1 基础语法与列选择2.1.1.2 列别名与表达式2.1.1.3 去重与排序2.1.2 WHERE…

深度解析:基于Python的微信小程序自动化操作实现

引言 在当今数字化时代,自动化技术正在改变我们与软件交互的方式。本文将深入解析一个使用Python实现的微信小程序自动化操作脚本,该脚本能够自动识别屏幕上的特定图像并执行点击操作。这种技术在自动化测试、批量操作和效率工具开发中有着广泛的应用前…

layui下拉框输入关键字才出数据

html里这样放 <div class"layui-form-item"><label class"layui-form-label">合同方&#xff1a;</label><div class"layui-input-block rightinline"><input type"text" name"select_text" ids…

bash和zsh的区别

Bash&#xff08;Bourne-Again SHell&#xff09;和 Zsh&#xff08;Z Shell&#xff09;都是 Unix/Linux 系统中的主流 Shell&#xff0c;但它们在功能、配置和用户体验上有显著区别。以下是两者的详细对比&#xff1a; 1. 历史与兼容性 特性BashZsh诞生时间1989 年&#xff…

组件通信-v-model

概述&#xff1a;实现 父↔子 之间相互通信。 前序知识 —— v-model的本质 <!-- 使用v-model指令 --> <input type"text" v-model"userName"><!-- v-model的本质是下面这行代码 --> <input type"text" :value"use…

虚拟机(Virtual Machine, VM)的简单介绍

目录 一、虚拟机的基本概念 二、虚拟化技术的分类 三、虚拟机的核心架构 四、虚拟机的核心应用场景 五、虚拟机的优缺点分析 六、虚拟机与容器技术的对比 七、虚拟机的未来趋势 八、总结 一、虚拟机的基本概念 虚拟机&#xff08;VM&#xff09;是一种通过软件模拟的完…

Xcode16提交App Store审核时提示bitcode报错

提交AppStore时出现bitcode报错&#xff0c;内容如下&#xff1a; Upload was cancelled. 2025-04-30 02:15:48.349 [ContentDelivery.Uploader.600000DB4380] Show Progress: Upload failed. Validation failed Invalid Executable. The executable Blockolot.app/Frameworks/…

Flutter TabBar / TabBarView 详解

目录 一、引言 二、基本用法 代码解析 三、主要属性 3.1 TabBar 3.2 TabBarView 四、进阶定制&#xff1a;突破默认样式 4.1 视觉样式深度定制 4.2 自定义指示器与标签 4.3 动态标签管理 五、工程实践关键技巧 5.1 性能优化方案 5.2 复杂手势处理 5.3 响应式布局…

mathtype转化

mathtype转latex 点击预置 选择剪切和复制预置 点击MathML 或 TeX&#xff0c;选择 LaTeX 2.09 and later mathtype转word自带编码器 与前面都相同&#xff0c;选择 MathML2.0&#xff08;m namespace&#xff09;

AI检测的荒谬性:当规则沦为一场概率游戏

当今高校对AI检测工具的依赖&#xff0c;已经演变成一场标准混乱的闹剧。有的学校指定格子达&#xff0c;有的迷信维普&#xff0c;而同一篇论文在不同的系统里竟能得出天差地别的结果——在格子达AI检测率仅12%的文章&#xff0c;放到维普却可能飙升到60%。这意味着&#xff0…

react-14defaultValue(仅在首次渲染时生效)和value(受 React 状态控制)

在 React 中&#xff0c;defaultChecked/checked 和 defaultValue/value 是用于处理表单元素初始值和受控值的属性对。区别在于表单元素是否受 React 组件状态控制。 1. defaultValue 作用&#xff1a;设置表单元素的初始值&#xff08;仅在首次渲染时生效&#xff09;。特点…

Go语言基础学习详细笔记

文章目录 初步了解Go语言Go语言诞生的主要问题和目标Go语言应用典型代表Go语言开发环境搭建经典HelloWorld 基本程序结构编写学习变量常量数据类型运算符 条件语句if语句switch 语句 跳转语句常用集合和字符串数组切片Map实现Set**字符串** 函数**基本使用用例验证** 面向对象编…

wrod生成pdf。[特殊字符]改背景

import subprocess import os,time from rembg import remove, new_session from PIL import Image import io from docxtpl import DocxTemplate, InlineImage from docx.shared import Inches input_folder ‘tupian’ # 输入文件夹 kouchu_folder ‘kouchu’ # 去背景图像…

基于SpringBoot和PostGIS的应急运输事件影响分析-以1.31侧翻事故为例

目录 前言 一、技术实现路径 1、需要使用的数据 2、空间分析方法 二、相关模块设计与实现 1、运输路线重现开发 2、事故点影响范围实现 3、WebGIS可视化实现 三、讨论 1、界面结果展示 2、影响范围分析 四、总结 前言 在交通运输发达的当今社会&#xff0c;应急运输…

NetBox:运维利器,网络与数据中心管理平台

NetBox 详细介绍&#xff1a;开源 IPAM 和 DCIM 工具的全面解析 1. 引言 在现代网络和数据中心管理中&#xff0c;基础设施的复杂性不断增加&#xff0c;传统的电子表格或手动记录方式已无法满足高效、准确和可扩展的管理需求。NetBox 作为一个开源的 IP 地址管理&#xff08…

澳鹏干货 | 动态判断:如何用“群体智慧“优化AI数据标注流程?

20世纪初&#xff0c;800人集体猜测一头公牛的重量&#xff0c;结果与真实数值误差不足1%——这就是著名的"群体智慧"效应。如今&#xff0c;这一古老智慧正以全新形态赋能AI训练&#xff1a;通过动态优化标注流程&#xff0c;让AI训练结果像人群一样达成精准共识。 …

go.mod没有自动缓存问题

今天在安装Gin框架的时候遇到了一个问题 在Terminal运行下面命令安装时&#xff0c;包已经被下载安装到了GoPath中的bkg/mod go get -u github.com/gin-gonic/gin但是由于使用的是Go Modules&#xff0c;GPT以及大多数人给的说法是 运行完这个依赖包会被自动同步更新到go.mod…

数据结构——排序(万字解说)初阶数据结构完

目录 1.排序 2.实现常见的排序算法 2.1 直接插入排序 ​编辑 2.2 希尔排序 2.3 直接选择排序 2.4 堆排序 2.5 冒泡排序 2.6 快速排序 2.6.1 递归版本 2.6.1.1 hoare版本 2.6.1.2 挖坑法 2.6.1.3 lomuto前后指针 2.6.1.4 时间复杂度 2.6.2 非递归版本 2.7 归并排序…