一、生产环境落地检查清单
然后分点,每个点有检查项和说明: 1. 敏感参数后端计算校验:所有会员等级、积分值、到期时间禁止前端传递,必须由后端根据消费金额、签到规则、任务完成状态等核心参数计算生成,前端仅做展示。检查点:代码审查是否存在直接接收前端传入的积分/会员等级字段直接入库的逻辑。 2. 接口请求签名校验:所有涉及积分变动、会员状态变更的接口,必须携带签名,签名生成规则包含请求参数、时间戳、随机串、服务端密钥,服务端校验签名有效性、时间戳有效期(比如5分钟内)、随机串是否重复使用。检查点:是否已实现签名生成与校验逻辑,密钥是否存储在配置中心/环境变量而非代码中。 3. 幂等性校验:所有积分变动、会员变更接口必须做幂等性控制,通过请求ID(每个请求唯一)关联操作记录,避免重复提交刷取积分。检查点:是否存在幂等表/缓存记录,重复请求是否直接返回上次处理结果而非重复执行。 4. 操作日志全链路留存:所有积分变动、会员状态变更的操作,必须记录操作人、操作IP、请求参数、变更前后值、服务端计算依据,日志留存至少6个月,便于溯源。检查点:日志是否包含完整的变更链路,是否接入ELK等日志系统便于检索。 5. 前端参数本地校验兜底:前端对接口返回的积分、会员等级等参数做本地合法性校验,比如积分不能为负、会员等级不能超过预设最大等级,避免被本地代理篡改后展示异常(注意这只是兜底,核心校验在后端)。检查点:前端是否实现基础的非空、范围校验。 6. 敏感操作二次验证:大额积分变动、会员等级升级等敏感操作,必须要求用户二次验证(短信验证码、支付密码等),避免账号被盗后恶意篡改。检查点:是否设置积分变动阈值,超过阈值是否触发二次验证。 然后第三部分是代码示例,要可运行的,比如写一个积分变动接口的签名校验+后端计算+幂等性的示例,用PHP写,要真实可用,比如:
400, 'msg' => '参数不合法']);
}
// 3. 时间戳校验(5分钟内有效)
if (abs(time() - $timestamp) > 300) {
jsonResponse(['code' => 400, 'msg' => '请求已过期']);
}
// 4. 签名校验
unset($requestParams['sign']);
$validSign = generateSign($requestParams, $secretKey);
if ($sign !== $validSign) {
jsonResponse(['code' => 403, 'msg' => '签名校验失败']);
}
// 5. 幂等性校验(用Redis存储已处理的request_id,过期时间24小时)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
if ($redis->get("point_request_{$requestId}")) {
jsonResponse(['code' => 200, 'msg' => '请求已处理', 'data' => ['point' => $redis->get("user_point_{$userId}")]]);
}
// 6. 后端计算积分(规则:1元=10积分,禁止前端传递积分值)
$addPoint = intval($orderAmount * 10);
// 更新用户积分(此处省略数据库操作逻辑)
// $newPoint = $userPoint + $addPoint;
// 7. 记录幂等标记
$redis->setex("point_request_{$requestId}", 86400, 1);
$redis->setex("user_point_{$userId}", 86400, $newPoint);
// 8. 记录操作日志(此处省略日志写入逻辑)
// log::info('积分变动', ['user_id' => $userId, 'add_point' => $addPoint, 'order_amount' => $orderAmount]);
jsonResponse(['code' => 200, 'msg' => '积分变动成功', 'data' => ['point' => $new如需更完整的 PHP 代码保护与在线加密服务,可访问 https://article.vvxyz.com 了解更多。