把结算请求里的 total 从 99 改成 1 再提交,订单金额真的变成了一元,支付页也跟着显示一元,从下单到支付没有任何一处拦住。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
curl -X POST https://api.example.com/order \ -d 'sku=1001&qty=1&total=1'
服务端直接拿前端传来的金额入库,价格、折扣、运费全在客户端算好,只做了格式和范围校验,没做来源校验,改一个数字就能一路走通。这一点先确认清楚,后面就不用反复试。
碰到「参数篡改防护」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,金额只由服务端按商品 id 和数量重新计算,前端结果只作参考;前端传上来的 total 只用于页面展示,绝对不参与下单金额计算;关键字段加签名校验,或者干脆不接收客户端传来的这个字段。
改完照着核一遍,同样改价提交之后订单金额仍然是 99,前端传上来的 total 被服务端忽略掉。
