有了前文几个步骤的分析和设计,TYPESDK的信息交互流程已经可以正常工作了,但是,这个流程还没有考虑到支付这样的过程中,至关重要的信息安全问题。

在整个交互过程中,游戏服务端,SDK服务端,渠道服务端都属于安全区域,这部分发生的数据交互,基本是可以信任的,只需要作相对简单的处理工作;而客户端,包括游戏客户端,SDK客户端都属于危险区域,在这部分产生的数据和请求,都有可能受到外部的拦截和篡改。因此,我们需要在流程上加以预防和控制。


图1

从示意图1可以看出。针对三类不同安全性的数据流,我们的处理原则也是不同的。

l  蓝色箭头所表示的是安全可信的请求。属于这类请求的是游戏服务端与SDK服务端之间通信的请求。对这类请求传送的信息,原则上可以直接予以信任,并且以之作为基础,完成流程和逻辑的控制。在TYPESDK的设计中,对这部分请求,设置的安全机制是简单的通信key签名校验。

l  绿色箭头所表示的是半可信的请求。具体来说包括渠道服务端与SDK服务端之间的通信请求。由于渠道服务端处于开发者可知范围之外,虽然绝大多数情况下该地址是可靠的,但是在将交互信息用于逻辑之前,需要做安全校验。通常采取的措施有:

n  数据摘要签名/请求串加密。这部分处理通常在渠道服务端文档内会写明处理逻辑及校验算法。

n  访问IP白名单控制。在SDK服务器上配置指定渠道IP白名单,只信任来自白名单内IP的请求。同样,部分渠道也会通过后台配置或技术人员联系的形式设置开发者的服务器IP为白名单。

l  红色箭头表示的是不可信的请求。基本上,与客户端通信的所有请求都是不可信的请求。由于各请求隶属的模块不同,处理方式也各有分别。基本上有以下几种:

n  渠道客户端库与渠道服务端之间的通信,这部分数据交互由渠道本身机制来保证其可靠性,采用的技术手段包括token验证,客户端加密,签名身份识别等等机制。对于开发者而言,可以简单的认为,从渠道提供的接口获得的数据是可信的,提交给渠道的信息也不用作多余的安全处理机制,否则可能会产生其他问题。

n  游戏客户端与服务端之间的通信,相信已经有很多专述文章说明。常见的安全检测机制包括token,时间戳,签名等校验方式。但是专注于安全的渠道库并非专注游戏性的游戏客户端可比。出现破解或者请求被拦截的情况可谓司空见惯。因此,在游戏逻辑架构设计的阶段就要将安全性要求考虑在内。遵循以下原则:

1.         原则上重要逻辑必须使用服务端计算,客户端只负责展示和效果。例如前一篇文字里提到过的创建订单逻辑,由服务端产生订单。客户端可以接收订单号然后展示给用户,以及传送给渠道客户端。

2.         原则上所有数据信息都以服务端保留的记录为准,客户端提供的记录或者数据只作为参考比对。有冲突时服从服务端。例如,用户破解了客户端并且篡改了客户端传输给渠道客户端的内部订单号。在后续的发货及对账时,游戏服务端只信任服务端自己保持的订单状态,对不符合的订单直接抛弃或留记录不处理。

n  SDK客户端与服务端之间的通信,这部分数据交互并不多,通常适用于一些token转发,换签之类的特殊渠道逻辑,后文会有详细说明。SDK服务端对这些不安全数据的处理方式是保留记录以资比对,但不作为任何逻辑的根基和依据。

根据以上原则,我们分析了各类数据交互的安全性特点以及处理原则,很容易就会发现,在我们原本的支付-发货逻辑中,缺失了重要的一环,即订单校验步骤。没有这一步骤,SDK服务端在收到渠道的发货回调后,会立刻通知游戏服务端处理发货逻辑。然而根据以上的分析,渠道支付订单的提交步骤事实上是在不安全区域-客户端内完成的,这一步骤可以被别有用心的用户拦截并修改。举例如下:

例1:用户点击游戏中的大礼包购买,生成了一笔金额为648元的订单,然后使用非法工具在渠道客户端提交订单时,拦截该订单,并修改其金额为0.01元,随即完成支付。渠道异步回调给SDK服务端时,SDK服务端判定其为合法订单并通知游戏服务端发货。结果是用户成功获取了非法利益648元。

例2:用户通过非法工具,获取并保存了自己一笔正常订单648元的所有订单信息。随后通过技术手段,将该订单的回调信息重发给了SDK服务端。该订单一切信息都与前一笔正常支付相同,SDK服务端判定其为合法订单并通知游戏服务端发货。结果是用户又成功获取了非法利益648元。

如何避免例子中的情形发生?比较简单的手段是在游戏服务端进行订单比对和信息校验,但是这样的处理不可避免的要和具体渠道的订单字段和处理逻辑挂钩,例如,渠道A的回调信息中含有订单金额字段,可以用于比对,而渠道B的回调信息中只有单价和数量字段,如需比对只能自己计算总金额。又例如,渠道C会定期做优惠活动,充值折扣打9折,返回的充值金额也是9折后的数值,和原本游戏订单中的金额不一致。这些逻辑不可能都让游戏服务端来处理,否则,就失去了聚合SDK的意义。因此,我们需要让游戏服务端提供一个订单查询verify接口,每当SDK服务端接收到渠道的回调请求时,调用该接口,进行订单比对,只有比对通过时,才会通知游戏服务端发货,这样就比较圆满的解决了这种情形。

但是,SDK服务端并不能解决所有问题,游戏服务端还是需要把好最后一道关。例如合法订单的重复发送逻辑,就需要游戏服务端处理好,接收到重复的订单号时,不要重复发货。

修改后的发货逻辑如下图所示:

图2

流程说明

1.       充值订单到帐后,渠道服务端异步通知TYPESDK服务端

2.       TYPESDK服务端通过订单中的内部订单号,查询充值信息提交接口提交的订单信息,获取游戏订单查询URL,向该URL发起请求获取游戏服务端保存的订单信息,用于对比判定该订单是否合法。

3.       游戏服务端通过提交的内部订单号查询订单信息,返回给TYPESDK服务端

4.       TYPE服务端校验通过,通知游戏服务端发货

5.       游戏服务端收到发货请求后先保存该请求,立刻返回TYPESDK服务端,表示已收到发货请求。将该订单的状态置为已付款未发货。

l  不要处理完发货请求之后再返回,可能造成渠道通知请求超时,导致该通知重复发送

l  注意渠道为保证通知到达,可能会重复发送发货请求,TYPESDK会原样转发所有请求。游戏服务端需要做防止同一订单号重复发货的处理。

6.       TYPESDK返回渠道服务端

7.       游戏服务端异步处理发货逻辑,将该订单的状态置为已发货。并通知游戏客户端

 

TYPESDK手游聚合SDK服务端设计思路与架构之四:流程优化之信息安全与订单校验的更多相关文章

  1. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  2. TYPESDK手游聚合SDK服务端设计思路与架构之二:服务端设计

    在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析.通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能 ...

  3. TYPESDK手游聚合SDK服务端设计思路与架构之三:流程优化之订单保存与通知

    经过前两篇文字的分析与设计,我们已经可以搭建出一个能够支持多游戏多渠道的聚合SDK服务端,但这只是理想化状态下的一个简化模型.如果接入渠道的逻辑都是按照理想化的简化过程来构建,那么对于支付的请求,我们 ...

  4. TYPESDK手游聚合SDK客户端远程开关:渠道支付黑名单

    渠道支付要做开关干嘛用呢?为什么要做这种东西呢? 这个教训来分享一下,我们的游戏上线公测了,59个渠道首发,其中包括了应用宝,UC,360等的大渠道,也包含有一些工会渠道和小渠道,上线后一切正常,但是 ...

  5. 手游聚合SDK开发之远程开关---渠道登入白名单

    白名单有啥好说的呢?无非就是筛选登入,大家第一眼看到就是这个印象,白名单也是有文章的,弄的时机不同会给你带来很不错的收益,注意是收益.还是举例来说,游戏上线前渠道都会做一个预下载,一般提前1-2天,这 ...

  6. 谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert

    反应式编程在客户端编程当中的应用相当广泛,而当前在服务端中的应用相对被提及较少.本篇将介绍如何在服务端编程中应用响应时编程来改进数据库操作的性能. 开篇就是结论 接续上一篇<谈反应式编程在服务端 ...

  7. 服务端高并发分布式架构 ESB 企业服务总线

    服务端高并发分布式架构演进之路 - 个人文章 - SegmentFault 思否 https://segmentfault.com/a/1190000018626163 ESB 企业服务总线讲解 ht ...

  8. rsync服务端排错思路

    rsync服务端排错思路       rsync服务端排错思路 查看rsync服务配置文件路径是否正确,正确的默认路径为/etc/rsyncd.conf 查看配置文件里host allow,host ...

  9. 移动APP服务端设计开发注意要点

    2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...

随机推荐

  1. 关键帧动画:@keyframes

    关键帧动画:@keyframes: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  2. GIT笔记命令行(1)

    Git简单易用,只要输入git就可以列出他的所有参数 C:\Users\spu>git usage: git [--version] [--help] [-C <path>] [-c ...

  3. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  4. 端盘子的服务生到月薪一万五的IT精英,你能相信吗

    一直以来,我都觉得自己不是一个有故事的人. 以前的我,是个乖宝宝,对父母言听计从,特别内向,甚至一度感觉到自卑.不上学之后,我干过送货员,去工地除泥搬砖,当过油漆工,去过工厂,还去饭店当过端盘子的服务 ...

  5. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  6. Visual Studio Code,完美的编辑器

    今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...

  7. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  8. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

  9. TODO List - 任务表

    TODO List - 任务表 Angular1 --> Ionic1 --> Vue --> Weex Python --> Django --> Tornado -- ...

  10. VS 2015相当不错的功能:C#交互窗口

    按照惯例,老周是先吹牛后讲正事.今天就给大伙吹吹这个事. 有网友不知道是不是昨晚喝高了,居然研究起老周来了.实话告诉你,老周没什么好研究的,老周又不是编译器,老周只是一个游离于大善大恶之间的平凡人,说 ...