记一次支付异步校验逻辑漏洞
2017-09-15 00:00
253 查看
摘要: 记一次支付异步校验逻辑漏洞,之前支付出现问题很长时间了,最后通过日志发现是最后核对金额时出现了问题。本文关于对PHP上面的整型数值处理问题
记一次支付异步校验逻辑漏洞,之前支付出现问题很长时间了,最后通过日志发现是最后核对金额时出现了问题。
举例,当用户使用微信支付1笔商品价格为19.9元的订单时,微信支付平台异步回调时会得到具体的用户支付金额。
如1990(以分为单位,即19.90元)。
校验逻辑
这个逻辑,第一眼看起来可能没什么问题,在实际的使用情况下,有的订单则会通过(SUCCESS),有的则可能会失败(FAIL)。
经过测试,发现这两个值的intval结果是完全不同的。
最后查阅了一番发现这是浮点数处理不当引起的问题。
http://php.net/manual/en/function.intval.php#60793 http://www.laruence.com/2013/03/26/2884.html
拜读了鸟哥的讲解之后,心里终于明白是怎么回事了。
最终的解决办法是,换做round或者先将浮点转换到字符串再使用intval进行即可。
修改后的一个逻辑
这个问题可能不只仅限于微信支付或者其他支付都有可能遇到,往往就在于多个业务的金额单位不一致导致的。
记一次支付异步校验逻辑漏洞,之前支付出现问题很长时间了,最后通过日志发现是最后核对金额时出现了问题。
举例,当用户使用微信支付1笔商品价格为19.9元的订单时,微信支付平台异步回调时会得到具体的用户支付金额。
如1990(以分为单位,即19.90元)。
校验逻辑
<?php $notify_money = 1990;//微信服务器返回的金额 $db_money = 19.90;//数据库存储的订单金额 if(intval($notify_money) === intval($db_money*100)){ echo 'SUCCESS'; }else{ echo 'FAIL'; }
这个逻辑,第一眼看起来可能没什么问题,在实际的使用情况下,有的订单则会通过(SUCCESS),有的则可能会失败(FAIL)。
经过测试,发现这两个值的intval结果是完全不同的。
最后查阅了一番发现这是浮点数处理不当引起的问题。
http://php.net/manual/en/function.intval.php#60793 http://www.laruence.com/2013/03/26/2884.html
拜读了鸟哥的讲解之后,心里终于明白是怎么回事了。
最终的解决办法是,换做round或者先将浮点转换到字符串再使用intval进行即可。
修改后的一个逻辑
<?php $notify_money = 1990;//微信服务器返回的金额 $db_money = 19.90;//数据库存储的订单金额 if(round($notify_money) === round($db_money*100)){ echo 'SUCCESS'; }else{ echo 'FAIL'; } //或 if(intval($notify_money) === intval((string)($db_money*100))){ echo 'SUCCESS'; }else{ echo 'FAIL'; }
这个问题可能不只仅限于微信支付或者其他支付都有可能遇到,往往就在于多个业务的金额单位不一致导致的。
相关文章推荐
- 逻辑漏洞之修改响应包绕过登录校验
- Web安全测试中常见逻辑漏洞解析
- Web安全测试中常见逻辑漏洞解析(实战篇)
- 使用AJAX完成用户名是否存在异步校验
- 异步操作校验工具awaitility源码分析
- Ajax+js 和 Ajax+Jquery实现异步校验
- [典型漏洞分享]功能逻辑缺陷,不需要旧手机号码即可绑定新手机号码【高】
- Node.js--异步机制下保证逻辑顺序的一些理解
- IOS开发中异步网络请求上实现同步逻辑
- Struts2的输入校验(二)一个Action校验对多个业务逻辑
- 记录一个bug,逻辑错误,结果正确,异步代码调试及IE下的渲染机制
- SSH网上商城颗粒归仓【一. AjAX异步校验】
- 业务逻辑漏洞
- 发现一个刷支付宝大额红包的逻辑漏洞!!
- 逻辑漏洞 & 信息泄露
- 分享两个常见的业务逻辑漏洞
- 用ajax异步交互进行注册信息的校验
- 使用AJAX完成用户名是否存在异步校验:
- 逻辑漏洞(-)
- 【技术分享】Windows程序的数字签名校验绕过漏洞 360bobao