• 程序员需要谨记的九大安全编码规则
    时间:2012-04-01   作者:墙头草   出处:oschina.net

    历史已经证明,软件设计的缺陷一直是导致其漏洞被利用的最主要的罪魁祸首。安全专家发现,多数漏洞源自常见软件中相对有限的一些漏洞。软件开发者和设计者应当严格检查程序中的各种错误,尽量在软件部署之前就减少或清除其中的漏洞。

    下面列举的这些方法会有助于开发人员提高编码的安全性:

    一、注意编译器警告

    程序员应当使用编译器的最高警告等级。在编译过程中,应当修改程序中的错误,直到警告解除。应当使用静态和动态的分析工具来检测和清除安全缺陷。

    二、根据安全策略设置软件架构

    设计者应创建一个软件架构,并在设计软件的过程中实施和强化安全策略。
    例如,如果你的系统在不同的时间要求不同的特权,就不妨考虑将系统分解成能够互联通信的不同的子系统,每一个系统都有自己适当的特权。这种“分而治之”的方法可以有效地提高应用程序的安全性。

    三、验证输入

    程序设计者在设计程序时必须验证来自所有不可信数据源的输入。
    适当的输入验证可以清除多数软件漏洞。在设计程序时,必须对多数外部的数据源抱着怀疑的态度,其中包括命令行参数、网络接口、环境变量、用户控制的文件等。

    四、保持程序简单

    设计者要尽量使程序短小精悍。复杂的设计会增加实施、配置、使用过程中出现错误的可能性。程序越复杂,就需要越多的复杂的安全控制,企业需要付出的努力也就会越多。

    五、拒绝默认访问


    访问决策的制定应当根据许可权限而不是根据其它的任何方面。这意味着,默认情况下,应当拒绝访问,程序的保护机制应当根据“允许谁访问”来确认访问条件。

    六、遵循最小特权原则

    程序的每个处理过程在执行时,都应当仅使用为完成其工作而需要的最小特权。任何提升的许可权限都要尽量持续最短的时间。这种方法可以减少攻击者用提升的特权执行任意代码的可能性。

    七、“净化”传送给其它系统的数据

    所谓“净化”是指从用户输入的数据中清除恶意数据,如清除用户提交表单时的恶意的或错误的字符。

    程序设计者必须对传送到复杂的子系统(如命令外壳、关系型数据库、购买的商业软件组件)的所有数据进行“净化”。攻击者有可能通过使用 SQL 注入命令或其它注入攻击来调用这些组件中没有被使用的功能。这未必是输入验证问题,因为被调用的复杂的子系统并不理解调用过程中的前后关系。由于调用程序 理解前后关系,所以我们要在调用子系统之前对数据进行“净化”。

    八、实施深度防御

    程序设计必须能够利用多种防御策略来管理风险。只有这样,才能在一层防御不够用或失效时,另外一层防御可以防止将安全设计上的缺陷变成可被利用的漏洞,从而可以限制攻击者利用漏洞的后果。例如,将安全编程技术与安全运行环境结合起来,可以减少在部署阶段残存在代码中的漏洞被攻击者在操作环境中利用的可能性。

    九、使用有效的质量保证技术

    良好的质量保证技术可以有效地确认和清除漏洞。模糊测试、渗透测试、源代码审计等都可以结合起来使用,以此作为一个有效的质量保证项目的一部 分。独立的安全检查可以使系统更安全。有资质的外部审查人员可以提供独立的观点,例如,外部人员有助于确认和纠正一些错误的设想。

    当然,为保证代码的安全,企业应当为开发语言和平台制定并实施一套健全的编码标准。

    网友留言/评论

    我要留言/评论

    相关文章

    25 个非常棒的 CSS3 菜单教程:本文收集了 25 个超棒的 CSS3 菜单教程,同时提供在线演示以及打包下载。
    百度统计流量研究院设计小结 - 可视化的快乐:百度统计流量研究院为了将数据更好的传达给用户,我们采用了动态数据可视化的方式(Interactive Infographic)。希望我们的设计能将用户带入到新鲜、愉悦的氛围之中。当然,我们在设计的过程中也体会到了可视化的快乐,并且希望与大家一同分享。
    jQuery 工具类库集锦:jQuery 是一个非常棒的类库,但是为了保证代码的干净以及代码的精简,它只提供最核心的功能。所以就有了很多其他的工具来丰富jQuery的功能。我在使用这些工具的时候发现我常常重复的编写一些代码,所以我就开始把它们整理到一个类库中。我把这些代码都包装成了jQuery的代码,但这并不是必须的,你也可以在其他JS类库中使用他们,或者单独使用。
    手机应用开发者需注意的20个事项:你想要成为手机开发者吗?你的目标可能是从应用商店中赚取大量金钱,也可能只是为了寻找新的挑战。无论你的目的是什么,当你设计应用时,可能需要考虑到代码层面之外的某些东西。
    产品经理应该如何写周报?:奋斗在互联网的每位同学,基本上都要写周报,更甚者还要写日报,但多少人打心底里觉得写的周报没有意义?只是为了写而写?今天,不妨从两个方面,简单说说,如何让周报真正的有意义和有效果。
    使用JSFL高效率做Flash:JSFL指Flash JavaScript,是JavaScript脚本文件,是用来扩展Flash IDE的重要工具。学会它、熟练使用它之后你会惊讶的发现,哇,原来可以这么高效率的做Flash啊!下面我们来看一看怎么使用JSFL。
    每个程序员都应读的书 - 首推《代码大全》:“如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本,你会选择哪本书呢?我希望这个书单列表内容丰富,可以涵盖很多东西。” 很多程序员响应,他们在推荐时也写下自己的评语。以前就有国内网友介绍这个程序员书单,不过都是推荐数 Top 10的书。其实除了前10本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语。下面就按照各本书的推荐数排列。
    JavaScript中的基本数据类型介绍:大家经常可以见到javascript中的一些数据类型,比如“undefined”、“boolean”、“string”等等,但是ECMAScipt中的变量又是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。所以javascript中用var关键字来定义变量,所以无法确定变量一定会存储什么值,也就不知道变量到底会是什么类型,因为可以随时改变变量的类型。今天这篇文章就和大家一起来学习javascript中的类型,这个问题虽然简单,但是还是有很多童鞋在很多时候没办法真正掌握它,其中不正确的地方请大家指出来,共同学习,共同进步。