博文

[转]安全编程: 验证输入--接收用户数据的最佳实践(2009-03-04 14:52:00)

摘要: 本文介绍了如何验证输入――任何安全程序的首要环节之一。 2003 年 7 月,计算机应急反应小组协调中心报告了 Microsoft Windows 的 DirectX MIDI 库中一组危险的漏洞。DirectXMIDI 库是用于播放 MIDI 格式音乐的底层 Windows 库。不幸的是,这个库没有能力去检查 MIDI 文件中的所有数据值;text、copyright 或者 MThd track 域中错误的值可以导致这个库的失效,而攻击者就可以利用这一漏洞让系统去执行他们想要执行的任何代码。这是特别危险的,因为 Internet Explorer 在察看一个包含 MIDI 文件链接的网页时,会自动加载那个文件并播放它。结果呢?一个攻击者只需要发布一个网页,当用户察看这个网页时,让用户的计算机删除所有的文件、把所有的机密文件通过电子邮件发送到其他地方、机器崩溃,或者去做任何攻击者想要做的事情。 检查输入 在几乎所有安全的程序中,您的第一道防线就是检查您所接收到的每一条数据。如果您能不让恶意的数据进入您的程序,或者至少不在程序中处理它,您的程序在面对攻击时将更加健壮。这与防火墙保护计算机的原理很类似;它不能预防所有的攻击,但它可以让一个程序更加稳定。这个过程叫做检查、验证或者过滤您的输入。 一个明显的问题是,在何处执行检查?是在数据最初进入程序时,或者是在一个低层次的例程在实际使用这些数据时?通常,最好在这两处都对其进行检查;这样,即使一个攻击者成功地突破了一道防线,他们还会遇到另一条。最重要的规则是所有的数据必须在使用之前被检查。 误区:寻找不正确的输入 安全程序开发人员一个最大的误区是尝试去查找“非法的”数据值。这是不对的,因为攻击者非常聪明;他们常常会想到出其他的危险数据值。所以应该做的是确定哪些是合法的,检查数据是否符合定义,拒绝所有不符合定义的数据。为了安全,在开始时应该特别谨慎,只允许您知道合法的数据。毕竟,如果您限制的过于严格,用户很快就会报告说程序不允许合法的数据进入。另一方面,如果你限制的过于宽松,可能得直到程序被破坏您才会发现这一问题。 例如,我们假设您要基于用户的某个输入创建文件名。您可能知道不应该允许用户的输入中包括“/”,但是仅仅去检查这一个字符可能是不对的。比如,控制字符呢?空格会不会出......

阅读全文(2018) | 评论:0

[转]安全编程: 开发安全的程序--正确的理念是成功的一半(2009-03-04 14:50:00)

摘要:安全编程: 开发安全的程序 正确的理念是成功的一半 David A. Wheeler (dwheelerNOSPAM@dwheeler.com), 专职研究员, Institute for Defense Analyses 2003 年 7 月 10 日 本专栏说明了如何编写安全的应用程序;重点讨论的是 Linux 操作系统,但是其中的许多原则也适用于任何系统。在当今联网的世界中,软件开发人员必须知道如何编写安全的程序,然而人们还未广泛认识到这一信息,也未向人们广泛讲授过这一信息。本文是安全编程(Secure programmer)专栏的第一篇文章,它介绍了如何编写安全的应用程序的基本思想,并讨论了如何针对特定的应用程序确定安全性需求。以后的几篇专栏文章将主要讨论几种不同的常见安全性漏洞以及如何防止它们。 欢迎来到不太友善的世界 案例 #1 味道闻起来很糟糕。两个多月以来,数十万加仑的污水流到了澳大利亚的公园、河流以及一家旅馆的地面上,而无人知晓其原因。水生动植物不断地死亡,而且有一条小河中的水已经变黑了。2000 年 4 月 23 日,当警方逮捕了一名男子时才解开了这个谜团,这名男子一直在使用计算机和无线电设备对管理污水和饮用水的机器进行完全控制。他的动机是什么呢?对其审讯的口供表明他正试图获得一份获利丰厚的咨询合同以解决他所造成的问题。事实原本还要糟糕得多。 案例 #2 有一个小偷(只知道他叫“Maxus”)从在线音乐公司 CD Universe 偷了 35 万个信用卡号,然后勒索 10 万美元赎金。当 CD Universe 拒绝支付赎金时,Maxus 就公开张贴了这些信用卡号 - 这损害了 CD Universe 的顾客并使这些顾客有合理的理由转而光顾其它商店。 案例 #3 CIA 最近了解到奥萨马·本·拉登的基地恐怖分子组织对网络恐怖活动有着“非常浓厚的兴趣”,这是人们先前所不相信的。链接到基地组织的计算机都可以获得各种计算机“破解”工具,旨在引起灾难性的破坏。 回页首 它们正在攻击您的程序 - 您准备好了吗? 计算机攻击已成为一个非常严重的问题。1997 年,CERT/CC 报告发生了 2134 起计算机安全性事件,并报告了 311 个截然......

阅读全文(1184) | 评论:0

一位软件工程师的6年总结(2009-01-17 09:45:00)

摘要:一位软件工程师的6年总结 作者:成晓旭 (声明:欢迎转载,请保证文章的完整性) “又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位;想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标。本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨在确定大的方向,算是废话吧。 谨以此文献给那个自己为你奉献3年青春与激情的开发团队。还有团队成员:PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD。 1、 分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈! 2、 一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,“我刚毕业,还不知道将来可能做什么?”,“跟着感觉走,先做做看”。因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情!”。 3、 软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦!”四分五裂、各奔东西。那个项目的“成功度”大家可想而知了。 4、 详细制定自己软件开发专业知......

阅读全文(1653) | 评论:1

[转]国际:写出漂亮代码的七种方法(2008-12-17 12:51:00)

摘要:首先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术、逻辑等。以下为写出漂亮代码的七种方法: 1, 尽快结束 if语句 例如下面这个JavaScript语句,看起来就很恐怖: 1 function findShape(flags, point, attribute, list) { 2    if(!findShapePoints(flags, point, attribute)) { 3        if(!doFindShapePoints(flags, point, attribute)) { 4            if(!findInShape(flags, point, attribute)) { 5                if(!findFromGuide(flags,point) { 6                    if(list.count() > 0 && flags == 1) { 7                          doSomething(); 8                  ......

阅读全文(1284) | 评论:0

[转]国际观点:有助于你编程而立即要做的10件事(2008-11-26 08:58:00)

摘要: 【CSDN编译】我们一直努力又努力去掌握那些对于我们来说是全新的东西。那么,我们做什么来帮助学习?下面是一个关于如何使你编程更迅速合理的10件事情的列表。我更习惯与使用Ruby on Rails,但下面的观点也适用于其他环境。

1.升级单元测试

你的编程没有测试?你应当随时进行测试,即TATFT ( testing all the fucking time )。当然你应当选择比仅是单元测试更好的方式。RSpec和Shoulda是两个可以选来使用的工具。

2.试用TDD

既然你在测试,那你就应当记录下这些测试。不要记录代码并用后来的测试覆盖它,而应当是方法的记录。TDD ( Test Drive Development ) 可以使你编出更好的代码,TATFT最重要的基础就是 TDD。进行TATFT并不难,首先你写下你所能做的最简单的测试并运行,观察测试的失败,然后写出执行语句以便使测试通过,不停地重复这样的过程就可以了。

3.自动化部署

自动化是你最好的朋友,想要实现自动Capistrano是相当好用的工具。在你配置部署好你的项目后,第一个要装的东西就应当是Capistrano。从第一天起就可以自动化部署将会节约你大量的时间。

4.安装 SCM

安装 SCM并学习使用它,这样做的好处是可以使那些超重的库中的代码不再那么冗繁,目前有大量的工具可以选择,我每天使用的是Git。Git是一款很特别的分布式SCM,即DSCM。DSCM是很有前景的,它可以同有其他库的用户们协同工作。

5.审查持续集成

现在我们已经测试了代码并将其安全的存放在库内。比起不停地测试,什么是更好的方式?自动测试是个不错的选择。很感激有cruisecontrol.rb的存在,这个应用工具自动运行了那些琐碎的测试。

6.了解你的代码

写代码是一回事,但是更重要的事情是了解代码。可以用四种自动化工具来帮助你了解代码:flog、 tarantula、rcov 和saikuro。这些工具分别有其独到之处,我很乐意向你介绍它们。
Flog,可以按字母排列的顺序来记录复杂的结果。

Tarantula,根据相关性原则和一些灵活的......

阅读全文(1314) | 评论:0

国际观点:鼓励未来的程序员[转](2008-11-10 17:50:00)

摘要:今天我在BBC新闻网站上看到了这篇有趣的文章,是关于英国游戏产业的,英国是如何一直在发展他们能力范围之上的游戏产业。这个问题总是被推向那些伴随着BBC Micro,ZX-81等的计算机长大的那一代人身上。那时候的计算机通常会有一个内置的BASIC解释器,你需要使用它来运行磁带或磁盘程序。 幸亏这些本地居民和便宜的计算机,英国多年来在游戏市场都占据强有力的地位。程序员通过进入杂志的列表开始了解编程,进而一步一步开始写自己的游戏代码。那时候的机器明显是比现在的机器要难用,但却是文档齐全,更具有编程文化——如果你想要使用,你至少需要学习少数命令。 现在,与今年的这篇文章比较一下,这篇文章就显得很压抑。很少人在学习编程,学校在全神贯注地教学生如何使用Word和Excel。难怪很多人都不愿意考虑去试一试OpenOffice! 我现在将近30岁,在9或10岁的时候拥有了我的第一个计算机(Amstrad CPC 6128)。所以我认为我是处于伴随着第一代计算机长大的那一代人的末梢儿。像很多其他人一样,我按照电话本大小的手册书里的指南去编写程序,建立一个地址本应用程序,花费几个小时键入程序,同时调试来自杂志的游戏。 90年代被认为是计算机产业的一个糟糕时期,尽管计算机网络是出现于这个时代。Commodore沉没,Apple也只是死里逃生,在短短几年之内,Windows开始占据桌面统治地位,其它的几乎都消失了。 Windows毋庸置疑在使计算机更易使用方面做出了杰出贡献(其实我不喜欢承认这件事情,我是一个Linux用户),同时还提供了写信,制作电子表格,到后来的网络冲浪等一些了不起的功能。一定程度上来说,它使计算机变成了一个黑匣子,使人们对学习编码不感兴趣。 同时,游戏控制台开始占据更大的游戏市场。一些流派(如RTS即时战略),已经在家庭计算机上占有了很强的地位,而且现在仍然如此。平台游戏如Mario和Sonic游戏渐渐退去舞台。所以,像过去那种为了玩游戏买计算机,然后开始编程的情况已经很少见了。 现在,如果你买一台Windows PC,没有任何方式会鼓励你用它编程序。没有任何种类的指导,也没有BASIC解释器(或者任何其它解释器)。现在的PC杂志似乎没有做任何鼓励人们学习编程的事情,我觉得这有一些悲哀。 拥有一台Windows计算机,......

阅读全文(1625) | 评论:0

国际:调查报告--行业中最需要的IT技能是什么(2008-10-12 17:17:00)

摘要:原文:http://news.csdn.net/n/20081010/119781.html现在,作为一名网络管理员和桌面支持专家真是太好了,基于这一原因,无线网络专家和Windows高手也很受欢迎。

    就像文末中的调查结果一样,某些具有特定技能的IT从业者很需要。Robert Half Technology是一家拥有全职IT调查人员和社会关系的公司,它调查了1400位CIO,调查问题是:他们最需要的IT技能是什么?
    在看到本文答案的同时,也请注意到这结果反映的也是当今IT的局势及其未来走向。

    不难理解,网络专家和Windows管理员的需求性很高。他们构成今天企业IT部门的后台,没有桌面支持,员工如何能够正常工作呢?

    再来看需求量很高的Web开发专家——尽管很多公司并不做在线销售。“软件作为一种服务”的发展和商业走向网络的趋势让他们的薪水很高。

    还有两个热门的工作实际是一码事:无线网络管理和通讯支持,企业不仅需要形式和硬件上的更需要从实际意义上的接入远程(这种趋势跟“软件作为一种服务”引出一个问题:几年后与IT相关的东西仍将只是企业内的事么?)

    调查揭示,尽管许多颇有影响力的家伙认为Java只在大学校园里占优势,但.NET 和 Java仍然是项目开发的核心环境。

    调查发现还有一个新的家伙备受推崇:虚拟化,这个几年前几乎不被CIO考虑的服务器延伸技术,现在却有三分之一的公司需求。开源开发,在几年前也根本不会在这份名单中,现在也有约五分之一的公司需求。

    还有一个相关的问题,调查问这些CIO:他们将怎样做来留住高水平的IT人员?最广泛的回答(28%)是雇佣有少许经验的人来培训他们。其他的回答包括提供激励措施给现有的员工来提供他们的生产力(26%),还有使用合同或项目制度(20%)。还有5%的CIO回答是“我不知道”,可以毫无疑问地断定他们肯定不会从员工那里得到最高产值。......

阅读全文(1809) | 评论:0

六十一条面向对象分析设计的经验原则(整理)(2008-10-05 21:41:00)

摘要:你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起    ----- Arthur J.Riel
  (1)所有数据都应该隐藏在所在的类的内部。

  (2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。

  (3)尽量减少类的协议中的消息。

  (4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 

  (5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。 

  如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。 

  (6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

  (7)类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。 

  (8)类应该只表示一个关键抽象。

  包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响 . 

  (9)把相关的数据和行为集中放置。

  设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 

  (10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。

  朝着稳定的方向进行依赖. 

  (11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。 

  (12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。

  (13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。

  规划一个接口而不是实现一个接口。 
......

阅读全文(1739) | 评论:0

工作以后十不要(2008-09-20 11:16:00)

摘要:第一:不要认为停留在心灵的舒适区域内是可以原谅的。      每个人都有一个舒适区域,在这个区域内是很自我的,不愿意被打扰,不愿意被push,不愿意和陌生的面孔交谈,不愿意被人指责,不愿意按照规定的时限做事,不愿意主动的去关心别人,不愿意去思考别人还有什么没有想到。这在学生时代是很容易被理解的,有时候这样的同学还跟“冷酷”“个性”这些字眼沾边,算作是褒义。然而相反,在工作之后,你要极力改变这一现状。否则,你会很快变成鸡尾酒会上唯一没有人理睬的对象,或是很快因为压力而内分泌失调。但是,如果你能很快打破之前学生期所处的舒适区域,比别人更快的处理好业务、人际、**之间的关系,那就能很快的脱颖而出。      在会议上,一个停留在心灵舒适区域的人会消极的听取领导的话语,消极的待命,很死的完成上级交给的事情,但从来不关心此事以外的任何事情,更不会想到多做一步,让接下来的别人的工作更加容易上手。而敢于打破这个舒适区域的人,敢于在适当的时候提出自己的看法和不理解,并在得到上级认可和指点之后把手头的工作尽快的完成,并随时接受别人的批评和调整。(注意:永远不要等待别人把你的想法说出来,这是典型的前者)      在工作上,当前者遇到一名新的同事,他会装作没有看见,继续自己的工作。殊不知新来的同事不久就变成了自己的上司。而后者则大方客气的自我介绍,并了解对方和自己的关系。      在聚会上,前者总是等待别人发言,并喜欢私下里评论对方的言语;如果这个桌子上没有人发言,那直到用餐结束,也没有人认识你。而后者是勇敢的和一同吃饭的开始介绍和闲谈,这看起来很困难,有时候会有失面子,但往往你会发现,对方是多么希望能和你说几句话。      以上只是很小的几个例子,但是要说明的是,大学生在走出校园的同时就要在工作上把校园中的“随意性”从身边赶走,尽早的冲出自己的舒适区域,开始做好和这个社会交流的准备。             开始工作之后的十个不要----(二)       第二:不要把“好像”;“有人会……”;“大概”;“晚些时候”;“或者”;“说不定”之类放在嘴边。尤其是和上级谈论工作的时候。      我十分痛恨听到的一句话是:“我晚些时候会把这个文件发给所有的人”;因为这往往预示着我必须时刻提醒他不要忘记。同样,以下这些言辞也会让人觉......

阅读全文(1470) | 评论:0

Google公开数据交换格式Protocol Buffers源码(2008-09-20 10:22:00)

摘要:Google于周一(7/7)宣布释出数据交换格式─Protocol Buffers原始码,这是Google内部用来加密网络或磁盘上大量数据的技术,Google宣称该格式比XML更胜一筹。 Google软件技术团队Kenton Varda表示,Google的任务为组织全球的数据,现在全球有上千种不同的数据格式,绝大多数的格式都是结构化的,所面临的重要挑战为如何全部将其加密,而就算像是XML这么好的格式都无法有效解决如此大规模的数据转换工作。 在Google所发表的文件中说明了Protocol Buffers在串行化结构性数据时胜过XML的优势,包括比XML更简单,程序小3~10倍,执行速度快20~100倍,比XML更清楚而且所产生的数据存取类别更容易被用来程序化。 Protocol Buffers与XML的设计概念不同,XML定义表格及数据组的架构,然而Protocol Buffers主要着重在程序逻辑。 Varda说,Protocol Buffers让使用者可以透过特定的语言定义简单的数据架构,并将其编译成可代表这些架构的类别,透过优化的程序代码以最大压缩格式分析与串行化这些讯息并完成这些类别,而且,这些类别非常容易使用。 Google自2001年开始开发Protocol Buffers供内部使用,目前释出的是Protocol Buffers 2.0版,Google表示,由于该公司打算释出的许多开放源码计划中有很多都使用了Protocol Buffers功能,因此率先释出Protocol Buffers......

阅读全文(1516) | 评论:0