专栏首页野路子程序员记一次支付异步校验逻辑漏洞

记一次支付异步校验逻辑漏洞

记一次支付异步校验逻辑漏洞,之前支付出现问题很长时间了,最后通过日志发现是最后核对金额时出现了问题。

举例,当用户使用微信支付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';
}

这个问题可能不只仅限于微信支付或者其他支付都有可能遇到,往往就在于多个业务的金额单位不一致导致的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Centos7+Nginx+PHP 基础WEB运行环境-多虚拟主机配置

    Eller
  • Thinkphp修改一句代码,使得foreach标签支持对象,增加变量[数组对象]混合解析法!

    Eller
  • CentOS7 更新最新内核 | RPM直接安装内核

    [root@xx ]# yum --enablerepo=elrepo-kernel install kernel-lt -y Loaded plugins:...

    Eller
  • python实现gabor滤波器提取纹理特征 提取指静脉纹理特征 指静脉切割代码

    徐飞机
  • ajaxFileUpload 报错jQuery.handleError is not a function

    今天用ajaxfileupload上传时,引入jq1.9,然后就报了这个错误,百度了下是说在jq1.4之后,这个文件上传插件就没有更新了,handlerErro...

    仙士可
  • AsyncTask的限制你了解吗?

    · executeOnExecutor(Executor exec, Params …)

    PhoenixZheng
  • 自连接的妙用

    SQL通常在不同的表或者视图间进行连接运算,但是也可以对相同的表进行“自连接”运算。自连接的处理过程不太容易想象,但是,一旦掌握自连接技术,便能快速解决很多问题...

    撸码那些事
  • 红帽助力HPC--我在Dell&RedHat HPC研讨会上的分享

    前言:今日,笔者受邀参加“Dell&RedHat HPC研讨会”。会上,分享了红帽在HPC领域的解决方案。由于很多朋友关心这个话题,因此将演讲的内容分享出来,供...

    魏新宇
  • 解决JS操作Cookies出现的乱码问题,修复WordPress评论乱码

    为了解决博客纯静态之后无法记住用户信息的问题,我将这个功能改成 JS 操作 Cookie 的方式,将用户信息直接保存到用户本地 cookies 当中,从而脱离 ...

    张戈
  • DenseNet:比ResNet更优的CNN模型

    本篇文章首先介绍DenseNet的原理以及网路架构,然后讲解DenseNet在Pytorch上的实现。

    机器学习算法工程师

扫码关注云+社区

领取腾讯云代金券