编写安全的代码-程序员头顶的达摩克利斯之剑

        程序员和黑客有种天生地说不完道不尽的恩怨纠缠,很多计数很高超的黑客同时也都是技术高超的程序员,但是大多数程序员却在同黑客做着生死抗争,特别是编写在公网上运行的业务系统的程序员,更是步步小心.但是与黑客相比,程序员的制肘更多一些,黑客往往只需要一个漏洞就可以逍遥了,但是程序员却要步提防,因为一个小漏洞就可能让自己陷入麻烦.程序是一个有机的整体,并不是所有的代码都无懈可击了的时候就能高枕无忧了,很多时候看来安全的系统却是到处都是口子,我们来看一个例子.
        系统A,是一个在线的交易系统,里面有用户注册功能,但是因为用户常常忘记自己的密码,所以提供了一个密码找回的功能.这里因为系统A使用的严格测试过的ORM的DataMapping组件,所以不存在任何注入的问题,所以用SQL注入看来是没戏了,但是这样子就安全了吗?所以程序员Z同学又在找回密码的地方作了很多加强安全性的处理,但是用户都有不好的习惯,因为嫌麻烦,很多时候用户的找回密码提示和答案都是一样的,Ctrl C,Ctrl V比较快嘛。所以在这里他首先是对IP进行限制,一个IP在30秒内只能请求3次,然后是账号每个帐户在找回密码的时候只能输错3次验证码,如果超过3次就提醒用户你的帐户今天不能再找回了,已经被冻结了,请明天再试。现在看起来这个系统真的是固若金汤了吧。
        其实安全就素那浮云一般,真的安全就是关掉服务器 。我们来看黑客H同学是如何简突破系统的,首先黑客H同学是菜鸟黑客,只会使用朔雪等,他在系统A有帐号,在找回密码的页面随便输入了一些东西后,他拿出工具开始写脚本。首先他要工具不停的根据字典请求字典上的用户名去找回密码,验证码随便输因为那个已经不重要的,他设定每个用户名只请求4次,然后分析回馈的结果HTML,如果找到“你的帐户今天不能再找回了”的字符串就把这个请求的用户名记录下来,因为这表明这个用户已经是在系统中存在的用户名。然后H同学就把这个工具放到了师傅送他的几个肉鸡上,然后就在等待结果了。
         第二天,H同学打开自己邮箱查看战果,这个时候工具已经找到了一千多个账号了,由于无法突破验证码,于是他决定手工来做,用已经找到的用户名,答案直接用找回密码提示,这样子经过一下午的努力,H同学获取到了80多个帐户的密码,每个帐户每月的消费限额是200元,这样子,经过2天的努力,菜鸟黑客H同学就获利1600元了。
         这里除了H同学是虚构的外,整个事件是真实案例改编,H同学的行为是通过分析IIS日志推导出的。
         这里提醒各位,很多时候不要光把眼光局限在代码本身,代码外的业务逻辑上如果有了漏洞也是非常的致命的。

posted on 2007-03-22 09:40  亚历山大同志  阅读(3639)  评论(25编辑  收藏  举报

导航