看到这个标题,你们一定一脸懵逼吧哈哈哈~最近拜读了一篇很棒的文章,学习到了计算机中的一种思想——幂等性。然后联想到了之前测支付漏洞时的一个测试点,今天用本文跟大家分享一下幂等性这种思想吧~

幂等性其实是源于数学,后来延伸到计算机领域。是指可以使用相同参数重复执行,并能获得相同结果的函数,这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。其实,幂等性指的就是指一次和多次请求某一个资源应该具有同样的副作用。

我们先从一个例子说起,假设有一个从账户取钱的远程API,我们暂时用类函数的方式记为:

bool withdraw(account_id, amount)

withdraw的语义是从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额。一种典型的情况是withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。如下图所示:

我们可以通过一些技巧把withdraw变成幂等的,比如:

int create_ticket()
bool idempotent_withdraw(ticket_id, account_id, amount)

create_ticket的语义是获取一个服务器端生成的唯一的处理号ticket_id,它将用于标识后续的操作。idempotent_withdraw和withdraw的区别在于关联了一个ticket_id,一个ticket_id表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。这样,idempotent_withdraw就符合幂等性了,客户端就可以放心地多次调用。
基于幂等性的解决方案中一个完整的取钱流程被分解成了两个步骤:1.调用create_ticket()获取ticket_id;2.调用idempotent_withdraw(ticket_id, account_id, amount)。虽然create_ticket不是幂等的,但在这种设计下,它对系统状态的影响可以忽略,加上idempotent_withdraw是幂等的,所以任何一步由于网络等原因失败或超时,客户端都可以重试,直到获得结果。如下图所示:

上面的例子是关于幂等性思想在取款流程的体现,其实支付是相似的。在取款流程中,服务器会生成一个唯一处理号ticket_id,而在支付流程中,会在提交订单时生成一个订单编号prepay_id,也叫预支付id。如果一个订单支付成功后,在支付页面(如下图)再次进行支付,应提示“该订单已支付”的提示。这就是幂等性在支付流程中的体现,同一个订单支付的操作只会进行一次,订单支付成功后,客户端尝试再次支付,此时会带着prepay_id进行请求,服务器会返回第一次支付请求的处理结果,所以同一个订单不会进行多次支付。

还有一种情况,就是提交订单、选择支付方式、跳转到支付宝二维码页面时,断掉网络,扫描二维码,进行支付。支付成功后,再次扫描二维码,看看会给出怎样的提示?我扫出的结果如下,提示我“该订单已支付”,也印证了“幂等性”的思想,一次请求和多次请求具有相同的结果。朋友们测试支付流程时可以测试一下~

其实幂等性的思想在http协议中也有体现,我会在以后的文章中继续与大家分享。

必测的支付漏洞(二)支付流程中“幂等性”相关推荐

  1. php微信支付漏洞,微信支付漏洞是什么回事?

    白帽汇安全研究院关注到国外安全社区公布微信支付官方SDK存在严重漏洞,可导致商家服务器被入侵(绕过支付的效果).目前,漏洞详细信息以及攻击方式已被公开,影响范围巨大(已有陌陌.vivo确认存在该漏洞) ...

  2. php微信支付使用ajax,微信扫码支付模式二支付状态Ajax轮询实例

    Ajax 轮训支付状态代码: //设置每隔1000毫秒执行一次load() 方法 setInterval(function(){load()},1000); function load(){ var ...

  3. 微信支付ajax实现支付,微信扫码支付模式二支付状态Ajax轮询实例

    Ajax 轮训支付状态代码: //设置每隔1000毫秒执行一次load() 方法 setInterval(function(){load()},1000); function load(){ var ...

  4. Web安全之支付漏洞

    一.快捷支付原理 商户网站接入支付结果有两种方式,一种是通过浏览器进行跳转,一种是服务器端一步通知 基于用户访问的浏览器,如果用户在银行页面支付成功后,直接关闭了 页面,并未等待银行跳转到支付结果页面 ...

  5. fiddler修改支付金额_支付漏洞总结

    请注意,本文编写于 113 天前,最后修改于 104 天前,其中某些信息可能已经过时. 快捷支付原理 商户网站接入支付结果有两种方式,一种是通过浏览器进行跳转通知,一种是服务器端异步通知 浏览器跳转 ...

  6. [6] 支付漏洞( 0 元购 )

                                                                                        <目录> 原理:支付 ...

  7. 记一次发现某餐饮企业二维码支付漏洞的经历

     背景 如今,移动支付已经成为了主流,无现金支付越来越普遍,我们出门完全不用带纸币,到商店买东西.餐馆吃饭.坐车等都可以用手机支付解决,这给我们带来了很大的便利:我们再也不用担心钱包被偷或者丢掉的问题 ...

  8. 支付漏洞总结 / 在线支付流程安全分析

    前言 大家对支付漏洞的理解通常都是篡改价格,已有的对支付漏洞的总结也是对现有的一些案例的经验式归类,没有上升到对在线支付流程深入分析的一个层面.这里尝试从分析在线支付流程,在线支付厂商的接入方式开始, ...

  9. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

最新文章

  1. MIMO系统ML检测(最大似然检测)
  2. Java桌面程序打包成exe可执行文件
  3. MysqlDataTruncation Mysql 数据插入错误
  4. Java编程讲义之Eclipse开发工具
  5. msyql 禁止远程访问
  6. Python协程--生成器(实现多任务)
  7. 孩子教育经验,自己整理,不看后悔一辈子
  8. 使用RedisTemplate实现Redis分布式锁出现的一些列问题(避坑)
  9. 一台计算机连接两个投影,用一台PC控制四台投影 投影机多屏幕演示功能详解
  10. bootstrap中col-xs-* 和 col-md-* 和col-sm-*这几个类是干嘛的啊?
  11. 两个栈实现队列,两个队列实现栈
  12. Python12/10--前端之display/overflow使用/清浮动的方式
  13. 网络应用瑞士军刀——Zentyal(4 常用命令)
  14. 美人计--图片asp木马
  15. 不用转化器PDF怎么转换成Word
  16. VMware Workstation创建虚拟机及安装MySQL数据库
  17. 中国芯片人才大军在哪里?IEEE Fellow,投资人,创业者,工程师
  18. In Search of an Understandable Consensus Algorithm(寻找可理解的共识算法)
  19. [茶香人家:原创资料]武夷岩茶冲泡实战篇
  20. 跳马周游c++_NOIP信息学奥赛C++视频教程

热门文章

  1. Oracle11gR2安装
  2. 新书推荐:《福格行为模型》
  3. 王小二C:一个大神的Android成长之路
  4. 商业世界的五大基础逻辑
  5. 全球最强图标库:码农福利图标库Easyicon、Thenounproject、icons8、flaticons超值大礼包,你值得拥有……
  6. 操作系统的重要性及系统调用和编程语言的移植性
  7. 游戏编程学习之项目历程
  8. java.lang.NoSuchFieldError: No static field id_sl_hlry of type I in class Lcom/bsoft/mob/common/R$id
  9. g4560和二代i5_优缺点爆料测评g4560和i5 6500有什么区别?哪个好?全方位深度解析评测...
  10. 阻碍NB-IoT技术在智能水表发展的4个原因分析