文件
mashangyoujiu/_ai_archive/docs/SECURITY_FIX_README.md

4.5 KiB

骑手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头
  • 保持原有功能不变,提高环境兼容性

测试

运行安全测试

# 命令行运行
php test_token_security.php

# 或在浏览器中访问
http://your-domain.com/mss.nahaichuan.com/test_token_security.php

运行兼容性测试

# 测试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>

错误响应格式

{
    "status": 0,
    "msg": "token验证失败"
}

BaseController核心方法

  • getRiderId(): 从token获取骑手ID
  • getRiderInfo(): 获取骑手详细信息
  • checkAuth(): 验证token有效性
  • getAllHeaders(): 兼容获取HTTP头信息
  • getToken(): 从多种来源获取token

修复完成时间: 2024年12月 修复人员: AI Assistant
测试状态: 已验证 最后更新: 兼容性修复完成