【EasyPan】項目常見問題解答(自用&持續更新中…)匯總版
一、loadDataList
方法概覽
@RequestMapping ( "/loadFileList" )
@GlobalInterceptor ( checkParams = true , checkLogin = false )
public ResponseVO loadDataList ( HttpSession session, @VerifyParam ( required = true ) String shareId, String filePid) { SessionShareDto shareSessionDto = checkShare ( session, shareId) ; FileInfoQuery query = new FileInfoQuery ( ) ; if ( ! StringTools . isEmpty ( filePid) && ! Constants . ZERO_STR. equals ( filePid) ) { fileInfoService. checkRootFilePid ( shareSessionDto. getFileId ( ) , shareSessionDto. getShareUserId ( ) , filePid ) ; query. setFilePid ( filePid) ; } else { query. setFileId ( shareSessionDto. getFileId ( ) ) ; } 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
方法深度分析
@Override
public void checkRootFilePid ( String rootFilePid, String userId, String fileId) { if ( StringTools . isEmpty ( fileId) ) { throw new BusinessException ( ResponseCodeEnum . CODE_600) ; } if ( rootFilePid. equals ( fileId) ) { return ; } checkFilePid ( rootFilePid, fileId, userId) ;
}
核心安全校驗邏輯(遞歸實現)
private void checkFilePid ( String rootFilePid, String fileId, String userId) { FileInfo fileInfo = this . fileInfoMapper. selectByFileIdAndUserId ( fileId, userId) ; if ( fileInfo == null ) { throw new BusinessException ( ResponseCodeEnum . CODE_600) ; } if ( Constants . ZERO_STR. equals ( fileInfo. getFilePid ( ) ) ) { throw new BusinessException ( ResponseCodeEnum . CODE_600) ; } if ( fileInfo. getFilePath ( ) . equals ( rootFilePid) ) { return ; } checkFilePid ( rootFilePid, fileInfo. getFilePid ( ) , userId) ;
}
三、安全防護矩陣
攻擊類型 防御措施 對應代碼位置 路徑遍歷 遞歸驗證父目錄歸屬 checkFilePid
遞歸調用越權訪問 用戶ID+文件ID雙重驗證 selectByFileIdAndUserId
惡意參數 空值檢查和根目錄特殊處理 首個if
判斷塊 共享根目錄 顯式攔截根目錄分享場景 ZERO_STR.equals
檢查
分層防御機制
防御層級 檢查點 攔截場景 典型攻擊示例 L1 空值檢查 空參數攻擊 fileId=null
L2 快速路徑匹配 直接訪問分享根目錄 正常訪問分享鏈接 L3 數據庫存在性檢查 偽造文件ID fileId=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"}