4.5 KiB
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
安全改进
修复前的问题
- 参数伪造:攻击者可以通过修改请求参数中的
rider_id来访问其他骑手的数据 - 无身份验证:大部分API端点没有验证用户身份
- 权限绕过:恶意用户可以直接调用API获取敏感信息
修复后的安全机制
- 统一Token验证:所有API调用都需要有效的JWT token
- 身份提取:从token中安全提取骑手ID,防止参数伪造
- 权限控制:确保用户只能访问自己的数据
- 错误处理:统一的错误响应,不泄露敏感信息
兼容性修复
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环境
部署建议
- 备份数据:部署前请备份数据库和代码
- 测试环境:先在测试环境验证修复效果
- 监控日志:部署后监控错误日志,确保没有意外问题
- 客户端更新:确保客户端应用正确发送token
技术细节
Token格式
Authorization: Bearer <JWT_TOKEN>
或
Token: <JWT_TOKEN>
错误响应格式
{
"status": 0,
"msg": "token验证失败"
}
BaseController核心方法
getRiderId(): 从token获取骑手IDgetRiderInfo(): 获取骑手详细信息checkAuth(): 验证token有效性getAllHeaders(): 兼容获取HTTP头信息getToken(): 从多种来源获取token
修复完成时间: 2024年12月
修复人员: AI Assistant
测试状态: 已验证
最后更新: 兼容性修复完成