`
sunnylocus
  • 浏览: 875716 次
  • 性别: Icon_minigender_1
  • 来自: 美国图森
社区版块
存档分类
最新评论

人在江湖:如何用代码保护自己

    博客分类:
  • Java
阅读更多

  现在上一点规模的系统,特别是金融行业的系统,业务规则复杂,一般是将系统分割成较小的子模块,每个人开发一个或几个模块,模块开发完成后做成一个jar包,供其它的模块调用,待所有模块开发完成后再集成在一起。对于充值系统而言则更为复杂,除了要将系统分解成子模块外,还要与众多外围系统交互,如收单服务商、充值中心、银行等。程序员就是其中一个或几个模块的开发者。

 

本文的讨论的要点是:在系统出现问题时,如何有理有据的保护好自己。

 

     对于软件开发者来说,我们在公司里一般处于弱势群体,每当系统出现问题造成事故的时候,运营人员一般都会将矛头指向研发人员。他们这么做一般是将责任撇清,以防引火上身。当出现事故给公司造成了实际损失,那么公司老板肯定会介入进来,总有人要背这个黑锅的,这个责任会从上级一级一级的压下来,直到推到某个模块具体编码的程序员身上,这时候我们开发者唯一进行反击的武器就是日志,如果日志没有清楚的记录什么时间调用了什么代码,什么时间调用的代码出现异常,异常的原因是什么等详细信息,那么负责编码的程序员也将是一头雾水莫口难辩,屎盆子全都扣到你头上,最后的结果就是背了黑锅走人。

 

     这种情况在我上一家公司已经发生了很多次,在入职的那段时间里Team leader经常提醒我们,编码一定要小心小心再小心,千万不要出错,出事故了我要挨老板的骂,你们有人就得被辞退。在部门svn服务器的文件夹里有专门存放事故的总结报告,一个事故,一个word文档。差不多有11个文档,直接造成经济损失的A级事故也有3个左右,这几个同仁被辞退的时候心情肯定是极其郁闷。前段时间得到上一家公司同事的消息,公司有个技术大牛写的程序和另外一家公司的系统进行业务交互,结果充值报文被人给修改了,金额被修改成了200万,结果这个大牛写的代码不严谨,没有考虑周全,收到响应报文时没有做金额校验就做了转账操作,听说这一下公司就损失了200万,老板娘在公司发飙,把笔记本重重的摔在他办公桌上。最后也是被辞退,无论技术多么牛的人还是小心些好,常言道:小心驶得万年船。

 

 

现在我用做过的一个充值系统的交互图来说明我的观点,如何调用黑洞代码(所谓黑洞代码就是说你将要调用的这个法,对你而言就是一个黑盒子,你不知道这个方法做了哪些操作,你不知道它会出现什么错误)

 

如图:

 

这是一个银联卡充值系统,这个系统的功能是:只要你将可以能够在网上进行支付的银行卡(哪个银行的都可以)和自己的手机号绑定,就可以随时用手机拨打自动语音充值电话给自己的手机号或着他人的手机号充值,这个系统的参与者有IVR语音服务商、收单服务商、电信充值中心。整个系统可划分为IVR语音模块、收单模块、电信指令交互模块、报文加解密模块、支付模块。

 

模块开发明细表:

 

模块名称 开发者 调用模块编号 序号
IVR语音交互模块 张三 2 1
收单模块 李四 5、3 2
电信指令交互模块 王五 4 3
报文加解密模块 那六   4
支付模块 小七   5

 

系统上线时非常的不稳定,充值失败率很高,平均每五笔就有一笔充值失败。问题定位在2和3这两个模块上,两位开发者各就执一词,争的面红耳赤。我们看看李四的代码,李四的代码去调用了王五的代码。

 

李四的代码截图:

 

 

 

用红色框圈起来的代码是王五的代码,王五的代码打成jar包供李四去调用,李四将王五的业务实现用Spring注入进来,然后直接去调用doCharge方法,并将结果返回,看起来没有问题。只不过只是表面看起来没有问题。

 

打问号的代码你敢大胆的这样用吗?

 

风险一:

 

doCharge方法对李四来说就是一个黑洞代码,不知道这个方法作了哪些操作,会不会有错误发生,因为doCharge方法未声明该方法可能要抛出的异常,李四以为这个doCharge方法是安全的,所以没有加try{}catch()代码捕获异常。什么事都怕万一,万一这个doCharge出现了异常怎么办?

 

风险二:

如果doCharge方法因为某种原因产生了死锁,那么你的调用结程死在里面了,永远不返回调用结果,这种情况怎么办?

 

 

风险一的应对措施:

  对于要调用的关键方法,无论它有没有声明要抛出的异常,我们都要对它保持怀疑的态度,加try{}catch捕获,并将捕获到异常,记录日志后,包装下继续抛给上层调用者。让上层调用者知道出错了,异常抛出了你就尽到了通知的义务,系统出问题与你没有关系,不然出了问题问你:你为什么不捕获异常?为什么不抛异常?虽然有很多种理由可以向质问者解释,但还是多一事不如少一事,别偷懒加个try{}catch()捕获可能出现的异常。

 

风险二的应对措施:

 

打个比喻:你是猎人,你要在山洞里抓一只狼崽出来,但是你不确定这个山洞里有什么危险,聪明的猎人会放猎狗进去抓狼崽,如果猎狗进去一段时间没有出来,说明里面有危险,猎人再想其它办法。如果猎人自己进去是有风险的,谁知道这个洞里面是狼还是虎。这个比喻想说的是,如果你要调用一个你认为不太安全的方法,不要用主线程调用(猎人),创建一个调用线程(一只猎狗)去调用,这样做的好处是能够监控调用是否成功,还可以设置调用的超时时间。

 

用这个比喻我们创建一个猎狗工具类,调用黑洞方法时,自动生成调用线程,如果调用时间超时,抛出TimeoutException

采用猎狗模式修改后的代码:

 

 

事后终于找到了bug了,问题出在王五的电信指令交互模块上,发送给电信的报文长度必须符合协议,否则电信那端收到非法包后会将Socket连接断开,协议规定充值金额必须是4位数字,不足4位的,左补0,比如说客户要充值10,补全的就是0010

充值100,就是0100.如果客户充值少于10元,要在左侧补3个0,这个bug出现在王五在处理个位充值时,少补了一个0,结果是客户充值2位数金额的话费就成功,一充值个位数的话费Socket连接就断开,李四的调用线程一直堵塞在这里。

 

如果一开始李四采用猎狗模式的话,出现问题一看日志便知道问题出在哪里,有理有据的指出问题所在,也不用背这个黑锅了。

 

上面的代码适合Jdk1.5以上使用,如果想在jdk1.4使用,请自己改造下。

 

 

PS:应网友要求,贴出猎狗的测试代码,请大家对比

 

普通调用:

 

 

猎狗调用:

 

 

 

 

 

 

 

 

 

67
10
分享到:
评论
11 楼 chansman 2011-10-13  
sunnylocus 写道
chansman 写道
个人愚建:
1 王五的doCharge方法本身就应该抛出异常(冲值失败,超时等),那么李四调用时便自动提示try+catch.
2 王五冲值拼0这个功能应该有相关的测试用例,而且调用外部接口应当打印日志,用于证据.

我以前也做电信的,的确日志留证据是十分的必要.

是的,是这样的。
1、这个问题王五是要抛出异常的,但他确实没有这么做,因为他没有抛出来,责任就在他身上,如果当时他这么做了,他就没有责任了。
2、当时有测试人员在测,那时候一个测试人员要测好几个产品,这个bug很隐蔽,测试人员没有深度的去测,结果没有发现这个很严重的bug


王五冲值拼0这个功能应该有相关的测试用例
这个应该是单元测试,王五应该自己测试他写的方法是否正确.
10 楼 sunnylocus 2011-10-13  
chansman 写道
个人愚建:
1 王五的doCharge方法本身就应该抛出异常(冲值失败,超时等),那么李四调用时便自动提示try+catch.
2 王五冲值拼0这个功能应该有相关的测试用例,而且调用外部接口应当打印日志,用于证据.

我以前也做电信的,的确日志留证据是十分的必要.

是的,是这样的。
1、这个问题王五是要抛出异常的,但他确实没有这么做,因为他没有抛出来,责任就在他身上,如果当时他这么做了,他就没有责任了。
2、当时有测试人员在测,那时候一个测试人员要测好几个产品,这个bug很隐蔽,测试人员没有深度的去测,结果没有发现这个很严重的bug
9 楼 chansman 2011-10-13  
个人愚建:
1 王五的doCharge方法本身就应该抛出异常(冲值失败,超时等),那么李四调用时便自动提示try+catch.
2 王五冲值拼0这个功能应该有相关的测试用例,而且调用外部接口应当打印日志,用于证据.

我以前也做电信的,的确日志留证据是十分的必要.
8 楼 sunnylocus 2011-10-13  
zhuxinyu 写道
太恶心的公司了。

这种情绪肯定是自上往下递推的

  很多东西和精力,都在内耗中损失了

人不能把更多的精力,投入到更好的事情中去。可悲啊

内耗,这种恶心的公司, 我一会不会待太久

是呀,我是深有体会。在那家公司我被人阴了好几次,知道了什么是小人,什么是江湖了。
7 楼 zhuxinyu 2011-10-13  
太恶心的公司了。

这种情绪肯定是自上往下递推的

  很多东西和精力,都在内耗中损失了

人不能把更多的精力,投入到更好的事情中去。可悲啊

内耗,这种恶心的公司, 我一会不会待太久
6 楼 sunnylocus 2011-10-13  
comsci 写道
这篇文章的内容是否让某些有企图的人学习到某些能够干坏事的技术?

你深谋远虑呀,这你都能想到。能够干坏事的技术我还在整理,讲的是如何截获充值报文,并实现重传攻击,重传就是同一个充值报文连续发送多次,本来我只给手机充值10元,每重传一次,你手机就多加10元钱,但只是做学习研究用的,千万别干坏事,被抓住可不得了,是要进班房的。
5 楼 sunnylocus 2011-10-13  
86asm 写道
这段代码看着好眼熟


你不会是我上一家公司的同事吧?
4 楼 comsci 2011-10-13  
这篇文章的内容是否让某些有企图的人学习到某些能够干坏事的技术?
3 楼 86asm 2011-10-12  
这段代码看着好眼熟

2 楼 tedeyang 2011-10-12  
惊叹的代码!更惊叹的是思路

对程序员是自利,对系统却是无谓的性能消耗。
有多少个并发调用就要启双倍的线程,虽然是缓存的,但是线程要消耗1M heap和325k的native 。

可见一个要创造一个高度互信的社会是多么重要。国内的很多问题都来源于由上到下的信用缺失
1 楼 conanca 2011-10-12  

好文,通过实际案例详细说明了这个宝贵经验!
感谢分享!

相关推荐

    热血江湖自动登陆易语言源代码

    《热血江湖自动登陆易语言源代码》是一款专为游戏《热血江湖》设计的登录辅助工具,其核心是用易语言编程实现的。易语言是一种基于汉语词汇的编程语言,旨在降低编程难度,让编程更加直观易懂。此源代码提供了自动...

    .Net江湖源代码

    《.Net江湖源代码》揭示了.NET框架下C#编程的深度奥秘,这份资源包含了一个名为“v1056_jh.net”的压缩包,它可能是某个项目或框架的源代码版本。...这是一份宝贵的资源,对任何想在.NET江湖中闯荡的人来说都极具价值。

    梦幻江湖精装309版.rar

    到100级上限就是2亿,这时,具有可以打穿所有人的保护等一些特殊能力;可以再次转生,再次转生后上体力上限变成等级乘以1000万,20级可以拥有2亿体力上限,具有可以在聊天室内隐身等更多特殊能力。每次转生,内力...

    LoginTool_热血江湖LS源码_热血江湖_

    在热血江湖的LS(Login Server)中,LoginTool可能包含了以下功能: 1. **身份验证**:LoginTool首先要验证玩家输入的账号和密码的合法性,这通常涉及到数据库查询,以确保账号存在且密码正确。 2. **安全机制**:...

    ccjh客户端代码

    "CCJH客户端代码"是一个专门针对Mud游戏(一种基于文本的多人在线扮演游戏)设计的软件项目,其目标是简化玩家在文字游戏中的操作体验。这个压缩包包含的"tClient"很可能是该客户端的核心代码文件或者启动程序。下面...

    热血江湖服务端C++源代码,完整游戏服务器代码

    《热血江湖服务端C++源代码》是一款专为游戏开发者提供的服务器端开发资源,它包含了构建完整游戏服务器所需的所有核心代码。这个项目对于那些热衷于游戏服务器开发、希望深入理解游戏后端运行机制的程序员来说,...

    热血江湖12.0服务端

    5. **安全性**:热血江湖12.0服务端必须具备强大的安全防护机制,包括防火墙、DDoS防御、防止SQL注入、XSS攻击等,以保护玩家账号的安全和游戏环境的纯净。 6. **GM工具**:GM(Game Master)工具是管理员用来管理...

    Android江湖

    根据提供的文件信息,“Android江湖”这一标题和描述均未给出明确的知识点方向,但从其关键词“Android”可以推测,文章内容可能与Android操作系统及其相关的开发、应用等方面有关。因此,以下将围绕Android操作系统...

    江湖拓客小程序源码1.0.16

    2. **源码**:源码是程序设计的基础,是程序员用编程语言编写的人类可读的代码。江湖拓客小程序的源码1.0.16意味着开发者可以查看、修改和定制代码,以适应特定的商业需求或功能扩展。 3. **客户资源获取**:这是...

    江湖装修至尊加盟版(未加密)

    这个版本没有加密码,意味着开发者可以直接访问和修改源代码,这对于有编程基础和技术团队的使用者来说是一个巨大的优势,可以按需定制功能,但对不熟悉代码的人来说可能会遇到困难。 1. **源码**:源码是程序的...

    心儿江湖留言板 v1.0

    此应用的核心特点是允许用户匿名留言,这为那些希望保持隐私的人提供了一个安全的环境。同时,斑主(即管理员)拥有权限回复或修改留言,确保了内容的质量和秩序。 此留言板还具有显示IP地址的功能,这在管理上具有...

    笑傲江湖(世纪先锋).zip

    从安全角度考虑,源代码的公开可能暴露敏感信息,例如数据库连接细节、加密算法等,因此在实际操作中应当保护好这类文件不被未经授权的访问。对于学习ASP或者Web开发的人来说,这些文件提供了一次实际应用的观察机会...

    天龙格斗江湖

    《天龙格斗江湖》是一款深受玩家喜爱的网络游戏,它融合了武侠元素和格斗机制,为玩家构建了一个热血沸腾的江湖世界。在这个世界里,玩家可以...通过不断学习和探索,玩家可以在这个江湖世界中书写属于自己的传奇篇章。

    慧明情感江湖 语音电影版

    7. **下载资料**:这可能意味着用户可以从平台上获取相关的软件、文档或教程,帮助他们更好地理解和使用慧明情感江湖,同时也可能有开发者上传的更新包或补丁供用户下载。 8. **开发与部署**:作为一款社区软件,其...

    Apk反编译包及批处理代码.rar

    这些脚本可能包含了一系列命令行调用,如使用Apktool进行解包,使用dex2jar转换DEX,最后用jd-gui显示源代码。通过批处理,用户可以一键执行这些步骤,提高效率。 在使用这些工具时,需要注意以下几点: - **版权与...

    枫叶江湖 v4.0

    不过没有错误 增加了许多常用SQL指令,方便新站长使用 增加了后台二道密码,总站长可以在后台修改,增加了江湖后台安全性 修改了正站长可以踢所有人 设置了限制一机多号|禁止代理ip的开关,在config.asp可以设置开启或...

    java开发手册-通用

    在编程过程中,对常量的定义和使用需要遵守一定的规则,以确保代码的可读性和维护性。 * 知识点:常量定义的重要性、常量定义的规则 (三) 注释规约 在 Java 中,注释是指对代码的解释和说明。良好的注释可以提高...

    72765616xmud.rar

    2. **加密与安全**:为了保护用户信息的安全,登录过程可能涉及到加密技术,如SSL/TLS协议,以确保数据传输的安全性,防止中间人攻击。 3. **数据序列化与反序列化**:客户端需要将用户输入的数据(如用户名、密码...

    江湖路之《游戏测试》讲义

    1. **资源融合:**游戏开发涉及多种资源,如程序代码、脚本、图像和音效等,配置管理需要确保这些资源能够被正确地整合在一起。 2. **一致性:**确保客户端和服务端的数据保持一致,避免因版本差异导致的问题。 3. *...

    pic16F1503中文PDF

    在文档的【部分内容】中,提供了有关Microchip器件代码保护功能的一些要点。文档指出,虽然Microchip产品能够达到数据手册中描述的技术标准,但Microchip依然认为他们的产品是同类产品中最安全的。然而,市场上存在...

Global site tag (gtag.js) - Google Analytics