154 行
4.5 KiB
Markdown
154 行
4.5 KiB
Markdown
# 骑手API安全修复说明
|
||
|
||
## 修复概述
|
||
|
||
本次修复主要解决了骑手API中的安全漏洞,通过实施统一的token验证机制,防止未授权访问。
|
||
|
||
## 修复内容
|
||
|
||
### 1. 创建BaseController基类
|
||
- 文件:`Application/RiderApi/Controller/BaseController.class.php`
|
||
- 功能:
|
||
- 统一的token验证机制
|
||
- 从token中提取riderId
|
||
- 获取骑手信息的通用方法
|
||
- 统一的错误处理
|
||
- 兼容性HTTP头获取
|
||
|
||
### 2. 修改所有控制器继承BaseController
|
||
|
||
#### AuthController.class.php
|
||
- 继承BaseController
|
||
- 修改方法:`realAuth`, `uploadHealthCert`, `getRiderInfo`
|
||
- 移除直接从请求参数获取riderId的代码
|
||
- 使用token验证获取riderId
|
||
|
||
#### MessageController.class.php
|
||
- 继承BaseController
|
||
- 修改方法:`getMessageList`, `getUnreadCount`, `markAsRead`, `markAllAsRead`, `deleteMessage`, `getMessageDetail`
|
||
- 移除直接从请求参数获取riderId的代码
|
||
- 使用token验证获取riderId
|
||
|
||
#### IncomeController.class.php
|
||
- 继承BaseController
|
||
- 修改方法:`getIncomeOverview`, `getIncomeDetail`, `getWithdrawHistory`, `getIncomeStats`
|
||
- 移除直接从请求参数获取riderId的代码
|
||
- 使用token验证获取riderId
|
||
|
||
#### OrderController.class.php
|
||
- 继承BaseController
|
||
- 修改方法:`getAvailableOrders`, `acceptOrder`, `getCurrentOrder`
|
||
- 移除直接从请求参数获取riderId的代码
|
||
- 使用token验证获取riderId
|
||
|
||
#### LocationController.class.php
|
||
- 继承BaseController
|
||
- 修改方法:`reportLocation`, `getCurrentLocation`, `getLocationTrack`, `calculateDeliveryDistance`
|
||
- 移除直接从请求参数获取riderId的代码
|
||
- 使用token验证获取riderId
|
||
|
||
## 安全改进
|
||
|
||
### 修复前的问题
|
||
1. **参数伪造**:攻击者可以通过修改请求参数中的`rider_id`来访问其他骑手的数据
|
||
2. **无身份验证**:大部分API端点没有验证用户身份
|
||
3. **权限绕过**:恶意用户可以直接调用API获取敏感信息
|
||
|
||
### 修复后的安全机制
|
||
1. **统一Token验证**:所有API调用都需要有效的JWT token
|
||
2. **身份提取**:从token中安全提取骑手ID,防止参数伪造
|
||
3. **权限控制**:确保用户只能访问自己的数据
|
||
4. **错误处理**:统一的错误响应,不泄露敏感信息
|
||
|
||
## 兼容性修复
|
||
|
||
### getallheaders()函数兼容性
|
||
- **问题**: `getallheaders()`函数在某些PHP环境中不可用(如CLI模式)
|
||
- **解决方案**: 实现了`getAllHeaders()`方法,自动检测环境并使用合适的方法获取HTTP头
|
||
- **兼容性**: 支持所有PHP环境,包括CLI模式和各种服务器配置
|
||
|
||
### 修复内容
|
||
- 添加了`getAllHeaders()`方法来替代`getallheaders()`
|
||
- 支持从`$_SERVER`变量中手动提取HTTP头
|
||
- 保持原有功能不变,提高环境兼容性
|
||
|
||
## 测试
|
||
|
||
### 运行安全测试
|
||
```bash
|
||
# 命令行运行
|
||
php test_token_security.php
|
||
|
||
# 或在浏览器中访问
|
||
http://your-domain.com/mss.nahaichuan.com/test_token_security.php
|
||
```
|
||
|
||
### 运行兼容性测试
|
||
```bash
|
||
# 测试HTTP头获取功能
|
||
php test_headers.php
|
||
```
|
||
|
||
### 测试内容
|
||
- 无token访问测试
|
||
- 无效token访问测试
|
||
- 覆盖所有修复的API端点
|
||
- HTTP头获取兼容性测试
|
||
|
||
### 预期结果
|
||
所有未授权访问应该被拒绝,返回适当的错误信息。
|
||
|
||
## 注意事项
|
||
|
||
### 不需要token验证的端点
|
||
以下端点保持原有逻辑,不需要token验证:
|
||
- `AuthController::sendCode` - 发送验证码(登录前调用)
|
||
- `AuthController::login` - 用户登录
|
||
- `MessageController::sendSystemMessage` - 管理员发送系统消息
|
||
- `MessageController::sendOrderMessage` - 系统发送订单消息
|
||
|
||
### 兼容性
|
||
- 保持原有API接口不变
|
||
- 支持JSON和表单数据提交
|
||
- 保持原有响应格式
|
||
- 兼容所有PHP环境
|
||
|
||
## 部署建议
|
||
|
||
1. **备份数据**:部署前请备份数据库和代码
|
||
2. **测试环境**:先在测试环境验证修复效果
|
||
3. **监控日志**:部署后监控错误日志,确保没有意外问题
|
||
4. **客户端更新**:确保客户端应用正确发送token
|
||
|
||
## 技术细节
|
||
|
||
### Token格式
|
||
```
|
||
Authorization: Bearer <JWT_TOKEN>
|
||
```
|
||
或
|
||
```
|
||
Token: <JWT_TOKEN>
|
||
```
|
||
|
||
### 错误响应格式
|
||
```json
|
||
{
|
||
"status": 0,
|
||
"msg": "token验证失败"
|
||
}
|
||
```
|
||
|
||
### BaseController核心方法
|
||
- `getRiderId()`: 从token获取骑手ID
|
||
- `getRiderInfo()`: 获取骑手详细信息
|
||
- `checkAuth()`: 验证token有效性
|
||
- `getAllHeaders()`: 兼容获取HTTP头信息
|
||
- `getToken()`: 从多种来源获取token
|
||
|
||
---
|
||
|
||
**修复完成时间**: 2024年12月
|
||
**修复人员**: AI Assistant
|
||
**测试状态**: 已验证
|
||
**最后更新**: 兼容性修复完成 |