# 骑手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 ``` 或 ``` Token: ``` ### 错误响应格式 ```json { "status": 0, "msg": "token验证失败" } ``` ### BaseController核心方法 - `getRiderId()`: 从token获取骑手ID - `getRiderInfo()`: 获取骑手详细信息 - `checkAuth()`: 验证token有效性 - `getAllHeaders()`: 兼容获取HTTP头信息 - `getToken()`: 从多种来源获取token --- **修复完成时间**: 2024年12月 **修复人员**: AI Assistant **测试状态**: 已验证 **最后更新**: 兼容性修复完成