一、什么是橫向越權
定義
橫向越權(Horizontal Privilege Escalation)是指 同一權限級別的用戶,通過篡改請求參數或資源標識,訪問本不屬于自己的數據或功能。
例子
假設一個在線商城,用戶 A 訪問訂單詳情的 URL:
GET /order/detail?orderId=1001
如果用戶 B 把 orderId
改成 1001
也能訪問到 A 的訂單,這就是 橫向越權漏洞。
與縱向越權的區別
橫向越權:同級別用戶之間的權限越界(普通用戶訪問到其他普通用戶的數據)。
縱向越權:低級別用戶訪問到高級別功能(普通用戶訪問到管理員功能)。
二、Spring Boot 項目中橫向越權的常見場景
參數直接控制資源 ID
例如:
/api/user/info?id=123
如果系統只根據
id
查詢數據庫,而不驗證當前用戶是否有權限訪問該 ID,對方就能訪問別人的信息。
僅靠前端控制訪問
比如前端菜單隱藏了“管理員功能”,但后端 API 并沒有權限驗證。
依賴會話中的用戶 ID 不嚴謹
有些開發會直接從請求參數中取 userId,而不是 session/JWT 中的用戶身份。
三、Spring Boot 中防止橫向越權的常用方案
1. 基于用戶身份的后端校驗(強制訪問控制)
無論前端傳什么參數,后端必須根據當前登錄用戶驗證資源歸屬。
示例:
@GetMapping("/order/detail")
public Order getOrderDetail(@RequestParam Long orderId, Principal principal) {String username = principal.getName(); // 當前登錄用戶Order order = orderService.findById(orderId);if (!order.getUsername().equals(username)) {throw new AccessDeniedException("無權訪問該訂單");}return order;
}
? 優點:簡單直接,杜絕參數篡改。
? 注意:不要直接信任前端傳的 userId
。
2. 使用 Spring Security + 方法級權限控制
利用 @PreAuthorize
/ @PostAuthorize
注解做 權限 + 數據校驗。
@PreAuthorize("@securityService.canAccessOrder(principal.username, #orderId)")
@GetMapping("/order/detail")
public Order getOrderDetail(@RequestParam Long orderId) {return orderService.findById(orderId);
}
SecurityService
:
@Service
public class SecurityService {public boolean canAccessOrder(String username, Long orderId) {Order order = orderMapper.findById(orderId);return order != null && order.getUsername().equals(username);}
}
? 優點:和權限體系無縫結合,復用性高。
? 注意:權限校驗邏輯要集中管理,避免散落到各處。
3. 數據層過濾(Query 加用戶條件)
在 DAO 層/Repository 層,直接加上當前用戶的條件,避免查到別人的數據。
@Select("SELECT * FROM orders WHERE id = #{orderId} AND username = #{username}")
Order findByIdAndUsername(@Param("orderId") Long orderId, @Param("username") String username);
? 優點:數據源頭控制。
? 注意:如果有批量查詢,需要特別注意條件一致性。
4. 資源標識加密/混淆
代替暴露自增 ID,例如使用 UUID、雪花 ID、HashID 等。
即使 ID 被猜測,也不能輕易訪問到資源。
String encryptedId = encrypt(orderId); // 例如AES加密
? 優點:增加枚舉成本,降低暴力破解風險。
? 注意:不是核心防御手段,必須配合權限校驗。
5. 審計 & 監控
對敏感數據的訪問做日志記錄。
配合異常訪問頻率報警(防止批量爆破 ID)。
四、防御策略總結
方法 | 層級 | 適用場景 | 缺點 |
---|---|---|---|
后端資源歸屬校驗 | 控制器層 | 所有敏感接口 | 需要每個接口寫邏輯 |
Spring Security 方法權限 | 服務層 | 業務方法 | 學習曲線高 |
數據層過濾 | DAO層 | 查詢數據接口 | 復雜查詢不易統一處理 |
ID 加密/混淆 | 前后端 | 避免 ID 猜測 | 不是單獨防御手段 |
審計與監控 | 全局 | 事后追蹤 | 無法預防攻擊 |