今天在看到某公众号一篇文章,大致内容是说的某某卖酒的商家 APP 支付接口未做金额效验,导致某某利用一分钱批量购买一堆高价酒的事情;
像这种支付漏洞,前几年挺流行的,不过现在基本都修复了,似乎成为程序员必修课了。。。
看了文章我产生了2个疑问:
- 这个漏洞是如何产生的?我们知道是没有对金额效验导致,但是为什么没有对金额效验?难道支付宝不效验这个吗?
- 我博客面板也有支付功能,本人一手对接的,我还真没效验过金额,那么是否会存在这个问题呢?
抱着这个想法,我先修复了下面板激活处 BUG,折腾了好久,原因是异步通知不会获取用户cookie,然后我代码中使用 WP 内置函数调用 cookie, IF 判断一直进不去,最后改成数据裤调用即可,表示开发太难了[aru_15]
回到正题,BUG 修复完,马上抓包测试了一波,总结如下:
- 支付宝并不会效验金额,也不能效验金额,它只会根据你提交的订单信息来为你生成和处理订单,这也就是为什么会出现这类一分钱刷单漏洞了。
- 金额不可控状态下,也就是金额后端代码写死,这种情况下即使前端修改金额,也无法创建订单,因为支付效验接口失败。
- 金额可控状态下,如果回调通知不做金额效验,那么会产生一分钱刷单漏洞。
修复方案:
支付宝服务器异步通知页面,或者支付宝服务器同步通知页面的业务逻辑代码增加一个 IF 判断 即可
/* 异步验证数据处理 */ //$total_amount 是 POST 接受到的金额变量 if($flag) {//验证成功 if( $title == 'Mr.Wu-面板激活' && $total_amount='100.00' ){ //业务处理代码 } }
本文作者为Mr.Wu,转载请注明,尊守博主劳动成果!
由于经常折腾代码,可能会导致个别文章内容显示错位或者别的 BUG 影响阅读; 如发现请在该文章下留言告知于我,thank you !