电商系统开发:技术负责人实操版清单:安全审计需要检查哪些环节

我参与过一次电商平台上线前审计,服务器漏洞扫描只发现了两个中风险配置问题,团队一度认为系统已经“基本安全”。但在业务流程复测中,测试账号却能够修改请求中的订单编号,读取到另一名用户的收货信息;客服角色还可以调用退款接口,只要替换一个参数,就能绕过原本只允许财务执行的操作。这个案例说明,电商系统安全审计最容易漏掉的,往往不是端口、补丁和防火墙,而是订单、权限、支付、营销和数据流之间的业务控制点。
对技术负责人而言,安全审计不是安排一次扫描、收一份报告,然后把问题状态改成“已处理”。真正有效的审计,必须回答四个问题:系统边界是否清楚,关键动作是否被正确授权,敏感数据是否在全生命周期内受到控制,发现问题后是否有证据证明已经整改并复测。
本文按照“审计范围,业务风险,技术控制,证据留存,整改闭环”的顺序,拆解电商系统开发过程中需要检查的关键环节。文中的项目数据主要来自匿名化的电商项目复盘、内部测试记录和情景模拟;未标注为公开统计的数据,不代表全行业普遍比例,适合用于建立审计方法,而不是直接作为监管结论。
安全审计的第一个结果,是系统资产和数据边界清晰。你必须知道哪些域名、接口、后台、数据库、云资源和第三方服务属于本次审计范围。如果连生产环境中实际暴露了多少个管理入口都说不清楚,后面的漏洞扫描覆盖率再高,也不能证明系统安全。
第二个结果,是关键业务动作可以被正确授权。电商系统中的“查看订单、修改价格、扣减库存、发起退款、导出数据、变更权限”都不是普通接口调用,而是带有业务后果的高风险动作。审计需要验证调用者是谁、能操作什么对象、能操作到什么程度,以及是否受到订单状态和业务规则约束。
第三个结果,是数据从产生、传输、存储、展示、导出到删除的全过程可控。很多团队只检查数据库加密,却忽略日志、缓存、消息队列、测试环境、备份文件和客服导出表。对个人信息和交易数据而言,泄露路径往往不在主库,而在这些“临时性”位置。
第四个结果,是风险有负责人、有期限、有复测证据。没有复测记录的整改,只能说明开发人员改过代码,不能说明漏洞已经关闭。技术负责人最终要验收的是控制效果,而不是工单动作。
| 审计结果 | 技术负责人需要确认的问题 | 最低证据 | 不通过的典型表现 |
|---|---|---|---|
| 资产边界清晰 | 是否覆盖前台、后台、API、云资源和第三方回调 | 资产清单、数据流图、版本记录 | 扫描范围依赖历史域名,新增接口未纳入 |
| 业务动作可控 | 调用者能否只操作被授权的数据和动作 | 权限矩阵、接口测试记录、状态机测试记录 | 替换对象编号即可访问他人订单 |
| 敏感数据受保护 | 日志、缓存、备份和测试环境是否泄露数据 | 字段分类表、日志样本、备份配置 | 日志中保留完整手机号和收货地址 |
| 整改形成闭环 | 问题是否复现、修复、复测并有关闭依据 | 漏洞单、修复提交、复测报告 | 只写“已修复”,没有验证过程 |

漏洞扫描擅长发现版本、配置和已知漏洞问题;代码审计擅长检查实现缺陷;渗透测试擅长模拟攻击路径;合规检查则关注组织是否满足特定要求。它们各自有价值,但没有任何一种手段可以单独覆盖完整的电商业务风险。
例如,扫描工具可能发现某个组件版本过低,却不会自动判断“优惠券是否允许重复领取”;渗透测试人员可能发现订单越权,但如果没有继续确认日志是否记录、告警是否触发、整改是否复测,技术负责人仍然无法判断系统是否形成了完整防线。
我的判断标准是:把工具结果当作线索,把业务流程测试当作验证,把证据链当作最终验收依据。这也是电商系统审计与普通服务器巡检最重要的区别。
电商系统不是单纯的信息展示系统。用户浏览商品之后,会进入购物车、提交订单、支付、履约、收货、售后和退款等多个状态。每一次状态变化,都可能伴随金额变化、库存变化、权益变化或数据权限变化。
如果系统只做“接口是否登录”的判断,而没有验证对象归属、当前状态、金额来源和操作幂等性,就会出现一种常见现象:接口在技术上有鉴权,在业务上却没有真正授权。
我通常会把电商核心流程拆成四类对象观察:人、货、钱、权益。人对应用户、客服、运营、财务和管理员;货对应商品、库存和物流;钱对应支付、退款和对账;权益对应优惠券、积分、会员等级和促销资格。四类对象之间只要有一条边界校验缺失,就可能产生可被利用的业务漏洞。
以“查询订单详情”为例,它至少同时涉及登录身份、订单归属、商家范围、客服授权范围和数据字段权限。普通用户只能看到自己的订单,商家只能看到自己店铺的订单,客服可能只能看到被分配的售后单,财务可能需要交易金额但不应读取完整收货地址。
如果后端代码只根据前端传来的 order_id 查询数据库,再把完整对象返回,接口就可能出现水平越权和数据过度暴露。前端隐藏按钮不能作为安全控制,因为攻击者可以直接构造请求。
// 不建议:仅依赖前端传入的订单编号
order = orderRepository.findById(request.orderId);
return order;
// 建议:同时校验当前身份、订单归属、角色范围和字段权限
order = orderRepository.findById(request.orderId);
if (order == null) {
throw new NotFoundException();
}
authorizationService.checkOrderAccess(
currentUser,
order,
request.operation
);
return dataMaskingService.filterFields(
order,
currentUser.getRole(),
request.operation
);上面的代码只是示意,实际项目仍需结合认证方式、租户模型、数据访问层和审计日志设计。关键不在于某一行代码,而在于权限判断必须接近数据访问和业务动作执行的位置,不能只停留在页面按钮层面。

第一类是“对象编号可替换”。测试人员只修改订单号、用户号、优惠券号或退款单号,就能读取或操作不属于自己的对象。这类问题往往出现在内部接口、移动端接口和历史兼容接口中。
第二类是“状态可以跳跃”。例如待支付订单能够直接调用确认收货接口,已退款订单仍可以再次发起退款,已取消订单还能够被物流接口推进到发货状态。系统可能在每个接口上都做了登录校验,但没有统一的状态机约束。
第三类是“金额由客户端参与决定”。商品价格、优惠金额、运费或退款金额如果直接接受前端参数,就可能遭遇篡改。即便客户端做了签名,也要确认签名密钥是否暴露、签名内容是否覆盖全部关键字段,以及服务端是否重新计算最终金额。
| 异常类型 | 常见触发方式 | 业务影响 | 优先级判断 |
|---|---|---|---|
| 对象越权 | 替换订单号、用户号、退款单号 | 隐私泄露、未授权操作 | 涉及批量读取或资金动作时通常为高风险 |
| 状态跳跃 | 直接调用后续状态接口 | 虚假发货、重复退款、库存错误 | 影响资金和履约时优先处理 |
| 金额篡改 | 修改价格、优惠、运费或退款参数 | 直接经济损失 | 上线前应完成修复和复测 |
扫描工具的结论只覆盖它能够识别的规则和资产。它通常无法理解某个角色是否应该退款、某张优惠券能否被同一用户重复领取,也无法判断某个订单状态的业务前置条件是否完整。
我在项目评审中会要求把扫描报告和业务测试报告分开验收。前者回答“技术组件是否存在已知问题”,后者回答“关键业务能否被未授权地操作”。两份报告缺一不可,但不能相互替代。
如果项目时间非常紧,至少应该对资金、订单、权限和数据导出四类流程做人工或半自动化复测。与其花两天把低风险配置问题全部整理成漂亮报告,不如先用半天验证退款接口能否重复执行。
前端隐藏按钮只能改善用户体验,不能防止用户构造请求。对于电商后台,运营人员、客服、财务和管理员可能使用相似的页面和接口,真正的权限边界必须在服务端、数据访问层或业务服务层执行。
审计时,我会优先删除页面限制这个假设,直接使用不同角色的访问令牌调用接口。需要测试的不是“页面上有没有这个按钮”,而是“这个角色拿到接口地址后能否完成动作”。
数据库加密可以降低存储介质泄露时的风险,但它解决不了授权过宽、日志明文、备份未保护、测试环境复制生产数据和客服导出失控等问题。
数据审计应沿着数据流检查。用户填写的收货地址可能进入数据库、缓存、消息队列、日志、搜索索引、客服工单、导出文件和备份。如果只抽查主库中的字段,很容易错过真正的暴露面。
支付回调是电商系统最敏感的外部输入之一。系统不能仅凭“收到一个请求”就把订单改成已支付,还需要验证签名、订单号、商户号、支付金额、支付状态和回调幂等性。
尤其要避免只验证签名而不校验金额的做法。即便回调来自可信渠道,也要确认回调中的订单和金额与本地订单一致,否则可能出现串单、金额不一致或错误入账。
安全问题关闭至少有三种不同含义:代码已经修改、问题无法再复现、业务风险已经被控制。技术负责人应该要求采用第二种或第三种标准,而不是接受“提交已合并”作为关闭依据。
复测记录至少应包含测试账号、请求条件、原始现象、修复版本、复测步骤、实际结果和残余风险。对于支付、退款、权限和数据导出问题,还应检查修复是否影响正常用户流程。

很多团队习惯使用高、中、低三级风险,但只依据通用评分或漏洞名称排序。电商系统还需要把资金、个人信息、订单履约和批量化能力纳入判断。
一个需要登录才能触发的优惠券重复领取问题,未必比一个无需登录即可读取大规模收货地址的接口更严重。反过来,一个只影响测试环境的中风险组件问题,也未必应该排在生产退款接口缺少幂等控制之前。
我建议使用五个问题做第一轮排序:是否影响资金,是否涉及批量数据,是否无需登录,是否可以自动化利用,是否会改变订单或库存状态。满足两个以上条件的问题,通常应进入上线前重点整改列表。
| 判断维度 | 低风险情形 | 高风险情形 | 对整改时限的影响 |
|---|---|---|---|
| 资金影响 | 只影响展示金额,不影响结算 | 可造成少付、重复退款或虚假入账 | 高风险通常应在上线前关闭 |
| 数据范围 | 单个测试账号可见非敏感字段 | 可批量读取用户身份或交易数据 | 需要立即限制访问并复测 |
| 利用门槛 | 需要内部高权限且有审批 | 普通用户或未登录即可触发 | 利用门槛越低,优先级越高 |
| 业务状态 | 不改变真实业务状态 | 改变订单、支付、库存或退款状态 | 需要增加状态机和幂等控制 |
| 发现能力 | 有实时告警和人工复核 | 长期无日志、无告警、不可追溯 | 需要同步补充监控和证据留存 |
技术负责人不应从“数据库、服务器、接口、前端”这些技术模块开始,而应先从业务流程和数据流开始。因为同一类数据可能穿过多个系统,风险也会在跨系统传递时发生。
以退款为例,用户申请退款后,数据可能经过订单服务、售后服务、支付服务、消息队列、财务对账系统和客服后台。任何一段没有校验订单归属、金额和状态,都可能导致重复退款或错误退款。
数据流图不需要一开始就画得非常复杂,但至少应标注数据来源、处理服务、存储位置、外部供应商、输出场景和删除节点。对于技术负责人而言,这张图的价值在于把“系统里哪里可能有数据”变成可分派的审计范围。
“检查接口安全”“加强权限管理”“做好数据脱敏”都不是可验收的任务。可执行的检查项应写成对象、动作、证据和通过标准四个部分。
例如,不要写“检查退款接口”;应写成“使用普通客服账号、财务账号和管理员账号分别发起退款请求,验证角色边界、退款金额上限、订单归属、重复请求和失败重试,并保存接口日志和测试结果”。
| 模糊任务 | 可执行任务 | 需要的证据 | 通过标准 |
|---|---|---|---|
| 加强权限控制 | 使用五类角色测试订单、退款、导出和权限变更接口 | 角色矩阵、请求记录、响应结果 | 角色只能完成矩阵中允许的动作 |
| 做好数据脱敏 | 抽查日志、客服页面、导出表和测试库中的敏感字段 | 字段分类表、样本截图、配置记录 | 非必要场景不展示完整敏感字段 |
| 保证支付安全 | 测试验签、金额校验、订单匹配、重复回调和异常对账 | 支付测试报告、回调日志、对账记录 | 伪造或重复回调不能导致错误入账 |

用户注册和登录需要检查密码策略、登录失败限制、验证码、会话有效期、找回密码、设备变更和异常登录处理。对于普通购物用户,不能为了追求复杂安全而制造过高的登录摩擦;对于涉及余额、退款、地址和账号安全的高风险动作,则应考虑二次验证或风险确认。
找回密码流程尤其容易被忽略。审计时要验证旧会话是否失效、绑定手机或邮箱是否经过验证、验证码是否有有效期和尝试次数限制,以及修改密码后是否会通知用户。如果找回密码后旧设备仍然保持长期有效会话,攻击者可能继续使用已经获得的令牌。
电商后台通常有运营、客服、财务、仓储、商家、审计和超级管理员等角色。管理端账号不应使用共享账号,尤其不能让多人共用一个“超级管理员”,否则出现误操作或异常变更时无法追责。
高权限账号需要至少检查登录来源、二次认证、强制下线、会话时长、操作审批和异常告警。批量导出、批量改价、批量调整库存、修改支付配置和变更权限等动作,最好采用二次确认或审批机制。
账号安全的难点通常不在创建,而在转岗、离职和临时授权。很多系统有新增账号流程,却没有定期复核和自动回收机制,导致历史账号长期保留不必要权限。
权限矩阵应该包含角色、资源、动作、数据范围和审批要求。例如“客服可以查看订单”仍然不够具体,还要说明是查看哪些订单、能看到哪些字段、能否导出、能否修改地址、能否执行退款。
| 角色 | 查看订单 | 修改价格 | 执行退款 | 导出用户数据 | 修改权限 |
|---|---|---|---|---|---|
| 普通用户 | 仅本人 | 否 | 仅申请 | 否 | 否 |
| 客服 | 授权范围 | 否 | 按审批或限额 | 否 | 否 |
| 财务 | 交易范围 | 否 | 按流程执行 | 受限 | 否 |
| 运营 | 业务范围 | 按审批 | 否或受限 | 脱敏数据 | 否 |
| 超级管理员 | 按授权 | 按审批 | 按审批 | 按审批 | 双人复核 |

前端展示的商品价格、折扣、运费和优惠金额都不能直接作为最终结算依据。服务端应根据商品当前价格、用户资格、活动规则、库存和配送条件重新计算订单金额,并记录计算过程。
审计时可以尝试修改请求中的商品单价、优惠金额、运费、数量和活动编号,再观察服务端是否拒绝异常值。还要检查价格快照机制:用户提交订单后,如果商品价格发生变化,系统应按照明确规则处理,而不是让订单在后续支付阶段重新读取一个不一致的价格。
库存问题不只是“数量不能为负数”。在秒杀、促销和高并发下单场景中,审计需要关注重复提交、超时重试、支付失败、订单取消和退款后的库存补偿。
如果创建订单接口因为网络超时被客户端重试两次,系统是否生成两个订单?如果扣库存成功但订单创建失败,库存是否回滚?如果支付成功但库存服务暂时不可用,订单如何进入人工处理?这些问题都需要通过故障注入或模拟测试验证。
营销活动通常由产品规则驱动,开发人员容易把规则写在多个服务中,最终出现领取、使用、退款和撤销之间不一致。审计应至少测试重复领取、重复使用、跨用户使用、过期后使用、门槛绕过、叠加顺序和退款后的权益回收。
对于积分和优惠券,不能只测试正常路径。应模拟请求重放、并发请求、不同设备同时操作和接口超时重试。凡是涉及“只能一次”的业务动作,都需要服务端幂等键、唯一约束或可靠的状态记录。
建议把订单允许的状态迁移显式列出来,而不是让每个接口自行修改状态。比如待支付可以进入已支付或已关闭,但不能直接进入已完成;已退款不能再次进入待退款;已取消订单不能被普通用户恢复成待发货。
| 当前状态 | 允许的下一状态 | 需要验证的条件 | 典型异常 |
|---|---|---|---|
| 待支付 | 已支付、已关闭 | 支付结果、超时规则、订单归属 | 未付款订单直接确认收货 |
| 已支付 | 待发货、退款中 | 库存、支付金额、退款权限 | 重复支付或未授权退款 |
| 待发货 | 已发货、退款中 | 仓储确认、物流单号、售后规则 | 普通用户修改发货状态 |
| 退款中 | 已退款、退款失败 | 退款金额、支付渠道、幂等键 | 重复退款或金额超限 |

创建支付请求时,服务端应根据本地订单重新确认订单状态、应付金额、支付渠道、商户信息和用户归属。客户端传入的金额只能作为展示或辅助参数,不能直接决定支付金额。
如果系统支持多次支付尝试,还要明确每一次支付单与原订单的关系。支付单是否唯一,支付失败后是否允许重新发起,旧支付单成功后如何处理,支付成功但订单更新失败时如何补偿,都应该有明确规则。
支付回调至少需要检查签名、订单号、商户号、金额、支付状态和本地订单当前状态。即使签名正确,也不能跳过本地订单校验,因为回调可能对应错误环境、错误订单或已经关闭的交易。
回调处理还必须具备幂等性。相同回调重复到达时,系统应返回可接受的处理结果,但不能重复增加余额、重复发货或重复触发营销权益。建议将支付流水号、订单号和处理状态记录在可查询的数据表中。
支付流程相对标准,退款流程却经常包含部分退款、拆单退款、售后补偿、人工退款和渠道失败重试。审计不能只测“点击退款是否成功”,而要验证每个退款单的可退金额、累计退款金额、订单状态和审批链。
如果客服拥有退款权限,必须设置金额上限和操作范围;如果财务执行人工退款,系统应保留申请人、审批人、执行人、金额、原因和渠道流水号。高金额或异常退款最好触发二次审批和实时告警。
对账系统需要比较订单、支付、退款和渠道流水之间的差异。只要出现支付成功但订单未完成、订单已退款但渠道未退款、渠道退款金额与本地不一致等情况,就应生成异常记录并明确处理责任人。
对账不是财务部门的孤立工作。技术团队需要保证流水可追溯、重试不重复、异常可重放、补偿有记录。否则遇到支付服务短暂故障时,系统可能既无法自动恢复,也无法给人工提供足够证据。

电商系统至少应区分身份信息、联系方式、收货信息、交易数据、客服资料、财务数据、认证凭证和密钥。不同类别的数据,访问人员、展示字段、保存期限和导出方式都不应完全相同。
数据分类的目的不是制作一张漂亮表格,而是让权限、脱敏、日志、备份和删除都有依据。例如客服可能需要看到部分收货地址,但不一定需要看到完整身份证信息;运营需要分析订单趋势,但不一定需要读取用户姓名和电话号码。
日志应记录谁在什么时间,以什么来源,对什么对象执行了什么动作,结果是什么。订单状态变化、价格修改、退款、数据导出、权限变更和配置发布等操作,不能只记录“请求成功”,还要能够关联到具体用户、订单或管理账号。
同时,日志不应记录不必要的完整密码、令牌、身份证号、支付凭证和收货信息。审计时建议抽查应用日志、网关日志、错误日志、消息消费日志和人工操作日志,而不是只看安全平台中的脱敏展示。
生产数据复制到测试环境,是很多电商团队的数据风险来源。即使测试库没有对外开放,也可能有更多开发和测试人员访问。如果必须使用真实结构,应优先使用脱敏数据或生成数据,并限制导出和复制权限。
备份也需要检查加密、访问控制、保存期限、跨区域复制、恢复权限和删除策略。备份文件一旦脱离生产环境,就可能绕过原有数据库权限,因此不能因为“不是在线库”而降低保护要求。
支付、短信、物流、客服、推荐、广告、云存储和数据分析服务都会扩大系统边界。需要检查传输字段、访问密钥、回调验签、权限范围、故障降级和供应商变更通知。
对于第三方回调,不能只验证来源地址。来源地址可能变化,也可能被错误配置。更可靠的做法是使用签名、时间戳、随机数、请求重放保护和本地业务校验共同确认。
| 数据位置 | 重点检查项 | 常见风险 | 建议证据 |
|---|---|---|---|
| 数据库 | 访问账号、字段权限、备份加密 | 高权限账号读取全部数据 | 账号清单、授权记录、备份配置 |
| 日志系统 | 敏感字段、访问范围、保存期限 | 完整手机号、地址或令牌明文 | 日志样本、脱敏规则、访问记录 |
| 缓存与消息队列 | 过期时间、网络隔离、消息内容 | 临时数据长期保存或被越权读取 | 配置快照、消息样本、网络规则 |
| 测试环境 | 真实数据复制、访问人员、外网暴露 | 生产数据在低防护环境扩散 | 环境清单、脱敏脚本、访问记录 |
| 第三方服务 | 传输字段、密钥、回调和故障处理 | 过度共享数据或回调被伪造 | 接口协议、密钥配置、回调测试 |

API 检查不能只验证是否返回 401 或 403。需要测试不同角色、不同租户、不同对象编号和不同业务状态下的访问结果,并确认服务端没有信任客户端传入的用户标识、价格、权限或状态。
批量查询、文件上传、导出、搜索和回调接口需要单独测试。它们往往比普通详情接口返回更多数据,或者允许更高频率调用。应设置分页上限、频率限制、文件类型校验、大小限制和异常告警。
前端代码、移动端安装包和小程序配置中可能包含接口地址、调试开关、测试密钥或过度权限。客户端可以被反编译和修改,因此不能把真正的权限判断、价格计算和签名密钥保护放在客户端。
移动端还应检查令牌保存方式、退出登录后的令牌失效、深链接跳转、旧版本接口、证书校验和敏感页面截屏策略。不同终端共用接口时,必须确认终端差异不会造成权限绕过。
基础设施审计包括外网暴露面、安全组、管理端口、容器权限、对象存储、数据库公网访问、中间件认证和密钥管理。常见问题不是系统完全没有防护,而是某个临时测试端口、旧负载均衡域名或历史对象存储桶没有被纳入资产管理。
建议把云资源清单和应用资产清单关联起来。每个公网入口都应有负责人、用途、创建时间、环境标识和下线条件。没有负责人且长期存在的资源,应视为重点清理对象。
开源组件版本、镜像基础层、私有依赖源、构建脚本和发布凭证都需要纳入检查。依赖扫描只能告诉你某个版本可能存在问题,还要确认该组件是否实际进入生产、是否被高风险路径调用、是否有临时缓解措施。
发布系统应限制谁能构建、谁能审批、谁能发布和谁能回滚。密钥不能写入代码仓库、镜像层或构建日志。生产发布最好保留版本、审批、变更内容和回滚结果,方便出现安全事件时快速定位。

日志审计至少覆盖登录、失败认证、权限变更、订单状态变化、价格修改、库存调整、退款、数据导出、配置发布和密钥使用。每条记录应尽量包含操作人、来源、对象、动作、结果和关联请求编号。
对于后台人工操作,最好不要只记录管理员账号,还要记录实际操作者和审批人。对于服务间调用,则需要通过链路编号关联上游请求,避免出现“系统自己改了状态,却找不到触发来源”的情况。
传统监控关注 CPU、内存和接口错误率,但电商安全还需要关注异常退款、短时间大量优惠券领取、批量查询订单、异常数据导出、支付回调失败和权限批量变更。
告警不应只追求数量多。每一类告警都要有接收人、响应时限、临时处置方式和关闭条件,否则告警越多,真正重要的异常越容易被淹没。
“备份成功”不等于“可以恢复”。审计需要实际抽取备份进行恢复演练,确认数据库、对象存储、消息数据、配置和密钥是否能够按业务顺序恢复。
电商系统恢复时不能只恢复数据库,还要验证订单、支付、库存和物流状态是否一致。比如数据库恢复到某个时间点后,支付渠道已经成功的订单如何补齐,库存如何重新校准,退款请求如何避免重复执行,都应写入恢复预案。
建议至少准备账号泄露、订单数据越权、支付回调异常、批量退款、对象存储暴露和供应链漏洞等情景。演练不一定要在生产环境进行,但必须包含发现、隔离、证据保全、业务降级、通知和复盘。
技术负责人要特别关注“谁有权决定暂停支付或关闭某个接口”。如果出现严重异常时所有人都在等待审批,系统可能继续扩大损失。应急预案需要写清楚授权边界和临时措施。

风险记录不能只写“存在越权漏洞”或“支付接口不安全”。它需要让开发、测试、产品和管理人员都能理解影响范围和完成标准。
风险等级应结合业务后果和项目阶段。一个高风险问题如果只存在于隔离测试环境,处理方式可能不同于生产环境中已被实际利用的高风险问题;一个中风险的数据导出问题,如果操作人范围极广,也可能需要优先处理。
| 风险情况 | 建议动作 | 是否允许上线 | 审批要求 |
|---|---|---|---|
| 可未授权退款、篡改支付金额 | 立即限制接口并修复,完成专项复测 | 原则上不允许 | 技术负责人和业务负责人共同确认 |
| 可批量读取敏感数据 | 先收紧访问范围,再修复和排查是否被利用 | 原则上不允许带病上线 | 需要数据安全和系统负责人参与 |
| 中风险配置问题,有临时防护 | 制定版本内整改计划并持续监控 | 可在审批后上线 | 记录例外原因和完成期限 |
| 低风险展示或文案问题 | 纳入普通版本计划 | 通常允许 | 由模块负责人确认 |
权限修复后,要验证未授权角色确实被拒绝,也要验证合法角色仍能完成正常工作。支付回调修复后,要验证伪造请求被拒绝,也要验证真实支付成功不会被错误拦截。
对于状态机、优惠券、库存和退款问题,回归测试尤其重要。开发人员可能通过收紧条件解决漏洞,却意外阻断正常售后或造成库存无法恢复。安全修复必须和业务回归一起完成。

在需求阶段,技术负责人应要求产品明确订单、支付、退款、优惠、积分、导出和后台操作的业务规则。规则如果没有写清楚,开发人员只能自行理解,后续很难通过测试判断什么是合法状态。
架构阶段需要完成资产清单、数据流图、角色矩阵、第三方清单和关键状态机。此时发现权限模型不合理,修改成本相对较低;如果等到上线前才发现所有后台角色共用一个权限模型,往往需要重构接口和页面。
开发阶段需要把对象归属、金额计算、状态迁移、幂等控制、字段过滤和审计日志作为验收条件,而不是留给上线前的安全人员临时检查。
功能测试通常覆盖正常流程,安全测试要增加异常流程。至少使用普通用户、客服、运营、财务、商家和管理员账号进行组合测试,并覆盖越权、重放、并发、超时、重复提交和状态跳跃。
测试数据要能支持跨用户、跨商家、跨租户和跨订单验证。如果所有测试账号都属于同一用户或同一商家,很多越权问题根本无法被发现。
上线前应根据风险等级设置门禁,而不是简单要求“所有问题都为零”。高风险资金问题、批量数据暴露问题和未授权管理操作通常不能带病上线;中风险问题如果已有临时控制,也必须有负责人、完成期限和例外审批。
上线审批材料至少应包括资产范围、测试报告、未关闭风险、临时措施、回滚方案、监控指标和应急联系人。没有这些材料,审批人无法判断例外是否可接受。
电商系统上线后会持续接入新活动、新支付渠道、新物流服务和新后台角色,因此上线前审计只能代表某一个版本和时间点。重大功能变更、权限模型变化、支付渠道调整和数据结构迁移,都应触发专项复审。
建议把安全检查纳入发布流程,并为订单、支付、退款、权限和数据导出建立持续监控指标。安全不是一个项目节点,而是随着业务变化不断重新确认边界的过程。
如果距离上线只剩一周,不建议把时间平均分给所有模块。应优先检查资金、订单状态、权限越权、敏感数据导出和第三方回调。
这种做法不是放弃基础设施安全,而是将有限时间优先用于可能直接造成资金损失、批量数据暴露或业务状态错误的风险。低风险版本问题可以进入后续计划,但必须记录,不能假装不存在。
小团队可以采用“研发自测、外部专项测试、负责人验收”的组合。研发负责把核心规则写成自动化测试,外部人员或独立测试人员负责挑战权限和业务逻辑,技术负责人负责判断风险是否允许上线。
最忌讳的是让开发人员只测试自己设计的正常流程。业务逻辑漏洞往往需要站在攻击者角度,尝试修改对象编号、金额、状态和请求顺序。
多商户系统要把租户隔离列为最高优先级之一。除了用户之间的水平越权,还要测试商户之间、平台与商户之间、主账号与子账号之间的数据边界。
测试时至少准备两个商户、两个商户管理员和多个普通用户,验证商品、订单、库存、结算、营销和售后数据不能跨租户访问。特别要关注后台导出和报表接口,因为这些接口经常通过批量查询绕过普通详情接口的租户条件。
发生事件后,审计重点不应只放在“如何修复已知漏洞”,还要检查是否存在同类路径、是否已经被利用、日志是否完整、备份是否可信以及应急流程是否有效。
例如发现一个订单越权接口后,不能只修复这一个 URL,还应搜索同一服务、同一数据表和同一权限中间件下的其他接口。事件复盘应形成规则、测试用例和监控告警,避免问题以不同形式重新出现。
这类项目除了修复问题,还需要提前准备证据。客户通常会关注资产范围、访问控制、漏洞扫描、渗透测试、数据保护、备份恢复、供应商管理和事件响应。
建议建立审计证据目录,按系统、版本、日期和责任人归档。证据应能说明检查过什么、发现什么、如何整改、谁批准例外,而不是只提交一份没有上下文的扫描报告。
电商系统安全审计最容易陷入两个极端:要么只做漏洞扫描,把工具报告当作最终答案;要么堆叠大量安全术语,却没有说明如何验证、谁来整改、什么情况算通过。
更可靠的做法,是从业务后果出发,把系统拆成资产、身份、对象、状态、金额、数据和证据七个维度。任何一个关键动作,都要能回答“谁发起、操作什么、为什么允许、状态是否正确、金额是否可信、日志是否完整、异常如何恢复”。
技术负责人不需要证明系统永远不会被攻击,但必须证明关键业务已经设置了合理控制,并且在出现异常时能够发现、限制、追踪和恢复。
下一步可以先用本文清单做一次两小时的快速盘点:列出所有生产入口,找出订单、支付、退款、权限和导出接口,再随机抽取普通用户、客服和财务三个角色进行越权测试。将发现的问题分别绑定证据、责任人、整改期限和复测步骤。完成这一步,系统才真正从“做过安全动作”走向“具备可验收的安全控制”。
我负责过一次商城上线前安全评审,研发团队已经完成了主机扫描、依赖扫描和接口扫描,报告里也没有高危漏洞。但业务方仍然担心订单、退款和后台权限,所以我想知道,漏洞扫描和完整的安全审计到底差在哪里?
不够。漏洞扫描解决的是“已知技术缺陷有没有暴露”,而安全审计还要验证“关键业务动作是否被正确授权、关键数据是否被妥善保护、异常发生后能不能追踪和恢复”。这是两个不同层次的问题。
我在一次商城上线评审中遇到过类似情况:扫描工具没有报出高危漏洞,但测试人员把请求中的订单编号替换成另一个用户的编号后,仍然能看到收货地址和物流信息。问题不在服务器补丁,而在接口只校验了“用户已登录”,没有校验“订单属于当前用户”。
技术负责人可以把审计拆成四层,而不是只拿一份扫描报告验收: 审计层重点检查常见证据不能替代的内容 基础设施端口、云资源、安全组、主机配置资产清单、配置快照、扫描报告业务越权和订单逻辑 应用技术认证、参数校验、文件上传、依赖组件测试记录、代码审查、依赖清单促销规则和退款流程 业务逻辑价格、库存、优惠券、订单状态、退款场景用例、接口复测记录单纯的端口扫描 运营治理日志、告警、备份、应急和整改闭环日志样本、演练报告、工单一次性漏洞报告 我的判断标准是:如果审计结论只有“扫描完成、无高危漏洞”,却没有资产范围、业务测试记录、权限矩阵和复测结果,这份材料最多只能叫技术扫描结果,不能作为电商系统上线安全验收的完整依据。
我发现很多安全检查都会覆盖登录、接口鉴权和数据库配置,却很少有人真正测试优惠券、库存和退款流程。我想知道,技术负责人应该优先安排哪些业务场景,才能避免上线后出现可以被批量利用的问题?
最容易漏检的不是登录,而是“看起来正常、组合起来却能被绕过”的业务规则。电商系统的风险通常藏在价格计算、订单状态流转、优惠权益和资金操作之间,传统漏洞扫描很难判断这些规则是否符合业务预期。我曾测试过一个促销接口,前端页面限制每个用户只能领取一次优惠券,但接口只根据请求参数判断用户身份。
通过并发发送请求,同一账号在短时间内领取了多张券。这个问题没有任何明显的报错,数据库和服务器也都运行正常,却会直接造成营销成本失控。
建议按资金影响和批量化难度安排测试顺序: 优先级测试场景应验证的问题高风险信号 1支付与退款金额、订单归属、回调验签、重复处理客户端可修改金额,退款无上限 2订单状态状态是否只能按合法路径推进待支付可直接变成已完成 3价格与库存服务端是否重新计算价格,扣库存是否幂等改前端参数即可低价下单或超卖 4优惠券与积分重复领取、跨用户使用、并发兑换规则只在前端校验 5售后流程退款次数、退款金额、操作权限已退款订单仍可再次退款 具体测试时不要只测单个接口,要按完整链路复现:创建订单、修改参数、支付、取消、申请售后,再重复提交关键请求。
尤其要加入并发、重放、跨账号和异常状态四类测试,因为很多业务漏洞只在这些边界条件下出现。技术负责人验收时,可以要求每个关键流程至少提供三项证据:正常流程记录、异常流程记录,以及整改后的复测记录。没有复测的“已修复”,在资金和订单场景里不应被视为真正关闭。
我负责的电商项目同时接入了支付、物流、短信和客服服务,数据会经过多个内部服务和第三方接口。团队目前只检查了支付页面是否使用加密连接,我担心真正的风险可能出现在回调、日志、缓存和备份里,应该如何系统排查?
你的担心是对的。支付安全不是“支付页面用了加密”这么简单,而是一条从下单、支付请求、支付回调、订单入账、退款到对账的完整链路。任何一个环节只信任前端参数或第三方返回内容,都可能产生资金和账务风险。我在审查支付接口时,通常会故意修改三个字段:支付金额、订单编号和商户标识,再重复发送回调。
一次测试中,系统虽然校验了回调签名,却没有再次比对回调金额和本地订单金额,导致“签名有效但业务数据不匹配”的结果仍然可能推进订单状态。验签本身正确,并不代表业务校验完整。
建议按以下链路逐段留证: 环节检查重点应保留的证据 创建订单价格由服务端计算,订单归属和库存状态正确订单快照、价格计算记录 发起支付金额、订单号、渠道信息不能由客户端任意决定请求日志、服务端计算结果 支付回调验签、金额匹配、订单匹配、幂等处理原始回调、验签结果、状态变更日志 退款退款权限、金额上限、重复退款和审批流程退款工单、审批记录、渠道结果 对账订单、支付、退款三方数据是否一致对账报告、差异告警和处理记录 数据审计则要沿着“数据库,缓存,消息队列,日志,导出文件,备份”检查,而不能只看生产数据库。
实际项目里,日志往往比数据库更容易被复制到测试环境或第三方日志平台,完整手机号、收货地址、令牌和支付标识如果没有脱敏,泄露面会迅速扩大。我的经验是,先画一张数据流图,再对每个节点回答四个问题:谁能访问、传输了什么、保存多久、删除后是否仍残留在备份或缓存中。
若团队无法在半天内说清这些问题,说明系统的数据边界还没有真正建立,继续做单点扫描的收益通常不高。
我经常遇到一种情况:安全报告列出了几十个问题,研发说大部分只是低风险,产品又希望按时发布,最后大家只能凭经验争论。我想要一套更客观的上线判断方法,既不把所有问题都一刀切,也不让高风险缺陷带病上线。
上线判断不能只看问题数量,也不能机械地只看通用风险分数。电商系统更应该关注问题是否影响资金、个人信息、订单履约和批量化攻击能力,因为一个“中危”的接口缺陷,放到优惠券或退款场景里,实际损失可能高于普通后台的信息泄露。
我通常把问题按“影响对象、利用门槛、可扩散性、业务后果、现有补偿措施”五个维度重新评估。例如,普通运营页面暴露一条非敏感配置,可能可以排期修复;但退款接口缺少幂等控制,即使需要登录,也应视为上线前必须处理的问题。
可以使用下面的决策表: 问题类型典型例子上线建议最低证据 阻断级可越权退款、伪造支付成功、批量读取用户数据未修复不得上线修复记录、复测通过、负责人确认 高风险订单状态可绕过、优惠券可批量滥用、管理端权限过宽原则上上线前关闭场景测试、临时缓解措施、复测结果 中风险日志脱敏不完整、告警规则缺失、非核心接口限流不足必须有明确期限和责任人整改工单、上线审批、计划完成时间 低风险错误提示过于详细、非敏感响应字段冗余纳入版本计划问题说明和排期记录 审计闭环至少要包含五个字段:问题描述、影响范围、复现条件、整改责任人、复测结果。
尤其要警惕“代码已提交”被当成“风险已关闭”,因为修复可能没有发布、配置可能没有生效,或者只修复了一个接口而遗漏了同类接口。我建议设置三道上线门禁。第一道由研发确认修复范围,第二道由测试或安全人员依据原始场景复测,第三道由技术负责人决定是否接受剩余风险。
涉及资金、批量个人信息和核心订单状态的问题,不应仅由项目进度压力决定是否放行。


读者评论
文章把安全审计从漏洞扫描延伸到订单、退款和数据权限,比较符合实际项目情况。尤其是对象越权和状态跳跃,确实容易被常规扫描遗漏。
前端隐藏按钮不能代替服务端授权这一点很实用。用不同角色令牌直接调用接口,比单看页面权限更能发现后台控制缺陷。
数据安全部分覆盖了日志、缓存、备份和测试环境,提醒得比较全面。不过文中更多是方法清单,落地时还需要结合具体系统补充责任人和检查频率。
将扫描、业务测试、整改和复测分开验收的思路较清晰。支付回调、重复退款和金额重算应列为上线前优先验证项,证据留存也不能省略。