【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.pswp.cn/bicheng/80041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80041.shtml
英文地址,請注明出處:http://en.pswp.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 歸并排序…