把订单详情地址中的编号加一,直接打开了其他客户的订单。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
SELECT * FROM orders WHERE id = %s AND user_id = %s # 或使用随机 UUID
详情查询只按编号取数据,没有校验当前用户与该订单的从属关系。这一点先确认清楚,后面就不用反复试。
「水平越权」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,查询条件带上用户标识;服务端校验归属;对外使用不可枚举的标识。
改完照着核一遍,他人订单返回 404,只有本人可以查看。