iap java md5_苹果应用内支付(iOS IAP)的流程与常用攻击方式

1. 客户端直接verify苹果的receipt 如果verify成功 自行发放商品

2. 客户端将receipt传给server,由server进行验证并发放商品

按照安全性原则, 客户端的所有信息都是不可信的,而且支付是业务中的核心模块,所以应该选择第二种。

下面简要介绍下,第二种方式的简单流程。

1. 客户端支付成功,拿到receipt

2. 客户端将receipt传到服务端

3. 服务端去apple验证receipt 如果验证成功 就发放receipt中的商品

支付安全性

作为支付,安全性是第一位的,下面简要分析一下常用的攻击手段。

1、劫持apple server攻击 => 通过dns污染,让客户端支付走到假的apple_server,并返回验证成功的response。 这个主要针对支付方式一 如果是支付方式二 就无效。

2、重复验证攻击 => 一个receipt重复使用多次

3、跨app攻击 => 别的app的receipt用到我们app中来

4、换价格攻击 => 低价商品代替高价商品

5、歧义攻击 => iap支付之前的status=0表示verify成功 而现在变为status=0只能表示receipt合法 具体支付详情需要通过in_app字段决定 For iOS 6 style transaction receipts, the status code reflects the status of the specific transaction’s receipt.

6、中间人攻击 => 伪造apple_server,如果用户支付就将

劫持apple server攻击

通过dns污染,让客户端通过假的apple_server进行verify,从而认为自己支付成功。这个主要针对**支付方式一**,如果是支付方式二,就没效果了。常见的iap hack软件@iAPFree @iAP Cracker 就是用的类似原理。

重复验证攻击

因为同一个receipt,如果第一次验证成功,那么之后每次验证都会成功。如果服务端没有判重机制,就会导致一个receipt被当做多次充值处理。

为了预防这种情况,我们可以将receipt做一次md5得到receipt_md5, 每次发送充值请求的时候就按照receipt_md5判重,如果重复就停止商品发放。

跨app攻击

通过在别的app中拿到receipt,然后发送到我们app中。因为这个receipt是合法的而且apple不会验证请求的源,所以这个receipt是可以验证通过的。

对于这种情况,我们可以判断apple verify的返回值apple_callback_data中对应的bundle_id和我们app的bundle_id是否一样来进行验证。

换价格攻击

在同一个app中,用低价商品的receipt伪造购买高价商品。这时候bundle_id和我们app的bundle_id是一致的。

针对这种情况, 我们可以从apple verify的返回值apple_callback_data中拿到对应的PRoduct_id, 并按照product_id来进行充值。 **不要信任客户端的product_id**

歧义攻击

在iOS6的时候,status=0表示此次支付成功,而现在变为status=0只表示receipt**整体上**合法。

所以,对iOS7即使是一个过期订单,也会返回status=0,如果还按照iOS6的逻辑处理,就会导致假充值。针对iOS7,我们应该不只通过status,还要通过in_app中的内容,来决定如何发放商品。

```

For iOS 6 style transaction receipts, the status code reflects the status of the specific transaction’s receipt.

For iOS 7 style app receipts, the status code is reflects the status of the app receipt as a whole. For example, if you send a valid app receipt that contains an expired subscription, the response is 0 because the receipt as a whole is valid.

中间人攻击

伪造apple server,将我们的支付请求转发到真的apple_server,拿到合法的receipt,并弄个假的receipt给客户端。这样就拿到一个合法的凭证。利用这个合法的receipt,伪造别人充值的请求,从而达到帮别人充值的目的。

针对中间人攻击,最重要的是保证a用户的支付receipt,不能被b用户使用。但是apple为了保护隐私,receipt中没有任何用户的个人信息,这就需要我们自己来保证。目前我们用加密的手段来做这个保证。

iOS支付的详细流程

客户端拿到apple的receipt 并发送到serverserver拿到这个receipt,向苹果验证得到apple_callback_data如果apple_callback_data的status是21007,说明是沙盒模式(不用花钱就可以购买) 要根据具体需求判断处理逻辑,需要注意的是,ios的审核在支付的时候就采用的沙盒模式。

如果apple_callback_data的status是0,就要从apple_callback_data[‘receipt’][‘in_app’]这个list中拿到所有的记录,每一个进行充值。然后记录transaction_id和original_transaction_id来防止同一个transaction被重复使用。

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html

https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1 => Original Transaction Identifier

返回所有充值成功和重复的transaction_id, 有client来complete transaction

总结

支付作为核心模块,除了技术上的保证,商务也应该每周进行一次对账。如果发现apple上的收入和服务端记录的收入有比较大的差距,就应该抓紧查看原因。

最后给出一个apple_callback_data的例子

{

"status": 0,

"environment": "Production",

"receipt": {

"download_id": 75017873837267,

"adam_id": 1149703708,

"request_date": "2017-01-13 06:57:20 Etc/GMT",

"app_item_id": 1149703708,

"original_purchase_date_pst": "2016-11-17 18:57:09 America/Los_Angeles",

"version_external_identifier": 820252187,

"receipt_creation_date": "2017-01-13 05:04:52 Etc/GMT",

"in_app": [

{

"is_trial_period": "false",

"purchase_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",

"original_purchase_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",

"product_id": "com.lucky917.live.gold.1.555",

"original_transaction_id": "350000191094279",

"original_purchase_date": "2017-01-13 05:04:52 Etc/GMT",

"original_purchase_date_ms": "1484283892000",

"purchase_date": "2017-01-13 05:04:52 Etc/GMT",

"purchase_date_ms": "1484283892000",

"transaction_id": "350000191094279",

"quantity": "1"

}

],

"original_purchase_date_ms": "1479437829000",

"original_application_version": "26",

"original_purchase_date": "2016-11-18 02:57:09 Etc/GMT",

"request_date_ms": "1484290640800",

"bundle_id": "com.lucky917.ios.Live",

"receipt_creation_date_pst": "2017-01-12 21:04:52 America/Los_Angeles",

"application_version": "32",

"request_date_pst": "2017-01-12 22:57:20 America/Los_Angeles",

"receipt_creation_date_ms": "1484283892000",

"receipt_type": "Production"

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java opencv orb_opencv python ORB算法

理论ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法,这个算法是由Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFTor SURF”的文章中提出.ORB算法分为两部分&#…

php中define的参数_php中define的用法有哪些

php中define的用法:1、【define()】函数定义一个常量;2、定义常量名称及值,代码为【define(name,value,case_insensitive)】;3、定义一个大小写敏感的常量。php中define的用法:1、define()函数理解1define()函数定义一…

php 判断是否文件,php 判断是否一个文件的函数is_file()应用举例

php手册中关于此函数的介绍。php is_file 判断是否为文件的代码is_file() 函数检查指定的文件名是否是正常的文件。is_file — Tells whether the filename is a regular file用法bool is_file ( string $filename ) $file 为必选参数如果文件存在且为正常的文件则返回 TRUE。例…

php 登陆微博,PHP调用微博接口实现微博登录的方法示例

在平时项目开发过程中,除了注册本网站账号进行登录之外,还可以调用第三方接口进行登录网站。这里以微博登录为例。微博登录包括身份认证、用户关系以及内容传播。允许用户使用微博帐号登录访问第三方网站,分享内容,同步信息。1、首…

php计算结果排序,php-按从数组计算出的值对数组进行排序

我从阵列中的数据库中获得了用户的经纬度我有我的经纬现在,我要计算距离并使用该距离对数据库中的用户进行排序$mylat $_SESSION[lat];$mylng $_SESSION[lng];$statement $pdo->prepare("SELECT * FROM users");$statement->execute();$users $statement-&…

php获取音频的时长,PHP编程获取音频文件时长的方法【基于getid3类】

本文实例讲述了PHP编程获取音频文件时长的方法。分享给大家供大家参考,具体如下:问题:昨天在新增论坛功能的时候,移动端显示音频文件需要知道是多长的音频;具体解决方案如下:首先就是数据库中增加保存音频文…

php strlen ctf,CTF中的PHP反序列化漏洞简单分析

[PHP] 纯文本查看 复制代码<?php class start_gg{public $mod1;public $mod2;public function __construct() #把$mod1赋值为Call类对象{$this->mod1 new Call();}public function __destruct(){$this->mod1->test1();}}class Call{public $mod1;…

2017php行情,2017年蔬菜行情特点及未来蔬菜价格走势分析

2017年蔬菜行情整体特点一、菜价走势前期低迷&#xff0c;后期逐渐回升&#xff1a;1.2017年1&#xff5e;10月的蔬菜平均价处于近3年同期的最低点&#xff1b;2.1&#xff5e;5月菜价创近5年同期最低。南方产区的实心菜花、散菜花、西兰花、团生菜、白萝卜、大白菜&#xff0c…

php毕设,php毕设

于不要钱&#xff01;这里值得提一句&#xff0c;必须是通过牛客网链接新注册的华为云账号&#xff0c;并且要实名认证&#xff0c;24岁以下自动会认定学生身份&#xff0c;这样才可以参加本次活动正好毕设的项目要用到云服务器&#xff0c;这个活动出现的太及时了&#xff0c;…

java实现layui静态表格分页,layui——数据表格分页实例

layui实现数据表格table分页功能&#xff0c;异步加载&#xff0c;表格渲染。总体流程&#xff1a;layui的数据表格设置分页参数开启可以从请求中看到如下图&#xff0c;所以我们需要在后端控制器接收分页数据page和limit进行操作&#xff0c;下面直接上代码分页链接框架&#…

php去掉数字前的符号,php导出excel如何处理使得表格数字值前面的0不被去掉

“首先&#xff0c;我们了解一下excel从web页面上导出的原理。当我们把这些数据发送到客户端时&#xff0c;我们想让客户端程序(浏览器)以excel的格式读取它&#xff0c;所以把mime类型设为&#xff1a;application/vnd.ms-excel&#xff0c;当excel读取文件时会以每个cell的格…

php繁体输出,PHP输出控制功能在简繁体转换中的应用

概要&#xff1a;本文对PHP的输出控制功能进行了简单介绍并对其在简繁体转化中的应用给出了具体思路和实例一 PHP 输出控制功能介绍PHP作为当今流行的脚本语言之一&#xff0c;具有编写简便&#xff0c;执行速度快&#xff0c;扩充性好等优点。PHP的输出信息控制函数可以让你控…

php专家预约系统设计,基于ThinkPHP框架的IT服务预约系统的设计与实现

2014 年 11 月 中国高等教育学会教育信息化分会第十二次学术年会论文集 1 文章编号&#xff1a;1000-5641(2014)00— 基于ThinkPHP 框架的IT 服务预约系统的设计 与实现 何秀全 (上海外国语大学信息技术中心&#xff0c;上海 200083) 摘要&#xff1a;一些高校 IT 部门需要提供…

mysql多列 groupby,MySQL多表查询之GroupBy

需求&#xff1a;根据主键id查询到该顾客最近的一次消费记录SQL代码如下&#xff1a;SELECTcbi.id,cbi.mob,cbi.identity_card,bcil.remark,bcil.orders_no,bcil.brand_no,bcil.with_date,bcil.scoreFROMcustomer_base_info cbiLEFT JOIN(SELECTA.customer_id,A.with_date,A.re…

java j2ssh替代jsch,jsch设置ssh协商算法优先级

最近接触jsch这个包&#xff0c;发现在默认情况下&#xff0c;jsch登录ssh的时候&#xff0c;协商的加密算法和mac算法都不是最高优先级的&#xff0c;这个时候需要手动配置一下算法列表&#xff0c;将强度高的调整在算法列表的前面&#xff0c;这样ssh链接的时候&#xff0c;如…

php验证码图片乱码,php ,验证码图片,乱码

找不出哪里出错了&#xff0c;但是预览时就是会出现一大堆乱码回复讨论(解决方案)乱码是浏览器显示了字符而不是图片么&#xff1f;关闭浏览器重新访问这个地址试试。如果还不行&#xff0c;应该是header的问题。图片输出&#xff0c;最好用UTF-8字符集&#xff0c;因为有可能会…

java 截取汉字首字母,java 取汉字首字母

有时候&#xff0c;可能会有一些类似这样的需求&#xff1a;对于这样的效果&#xff0c;我们可以有类似这样的解决方案&#xff1a;package bys.utils;import java.io.UnsupportedEncodingException;/*** Created by toutou on 2014/2/21*/public class ChineseCharacterHelper…

php给别人写接口,php给客户端写接口记录

通过控制器实现类似Java的工厂模式在主入口文件中通过DIRECTORY_SEPARATOR和dirname(__FILE__)以及url中的参数拼接控制模块文件&#xff0c;通过include 进入子控制模块$l DIRECTORY_SEPARATOR;$dir dirname(__FILE__);$ctrlName trim($operation);$controllerFile "…

html wap php,wap.php

header(Content-type:text/html; Charsetutf-8);/*** 请填写以下配置信息 ***/$appid xxxxx; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥&#xff0c;填写添加了电脑网站支付的应用的APPID$returnUrl http://www.xxx.com/alipay/return.php; //付款成…

php5.0相等,关于php:3个相等

&#xff0c;和有什么区别&#xff1f;我认为使用一个等号表示变量&#xff0c;而使用两个等号表示比较条件&#xff0c;最后使用三个等号表示比较变量的值。看看这个例子...我已经发布了&#xff0c;它将澄清更多的事情..对于高级PHP用户&#xff0c;了解和之间的区别并问自己…