[译] 防守式编程的艺术

论坛 期权论坛 区块链     
掘金官方   2018-12-29 15:26   4646   0
           

为什么开发人员不编写安全代码? 我们不再在这里讨论 “干净的代码” 。我们从一个纯粹的角度,软件的安全性来讨论更多的东西。是的,因为一个不安全的软件几乎是没用的。让我们来看看不安全的软件意味着什么。


  • 欧洲航天局的 Ariane 5 Flight 501 在起飞后 40 秒(1996年6月4日)被毁。10 亿美元的原型火箭由于机载导航软件中的错误而自毁。


  • 在 20 世纪 80 年代,一个治疗机中控制 Therac-25 辐射的的代码错误,导致其施用过量的 X 射线致使至少五名患者死亡。


  • MIM-104 爱国者的软件错误导致其系统时钟在 100 小时时段内偏移三分之一秒,以至于无法定位和拦截来袭导弹。伊拉克导弹袭击了沙特阿拉伯在达哈兰的一个军事大院( 1991 年 2 月 25 日 ),杀害了 28 名美国人。


这些例子足以让我们认识到编写安全的软件,特别是在某些情况下是多么重要。在其他使用情况下,我们也应该知道我们软件错误会带给我们什么。[h2]防守式编程角度一[/h2]

为什么我认为防守式编程在某些项目中是一个发现这些问题的好方法?
防御不可能,因为不可能将可能发生。

对于防御性编程有很多定义,它还取决于安全性的级别和您的软件项目所需的资源级别。

防守式编程是一种防守式设计,旨在确保在意外的情况下软件的持续性功能,防守式编程实践常被用在高可用性,需要安全的地方 — 维基百科

我个人认为这种方法适合当你处理一个大的、长期的、有许多人参与的项目。 例如,需要大量维护的开源项目。

为了实现防守式编程方法,让我谈谈我个人简陋的观点。[h2]从不相信用户输入[/h2]

假设你总是会收到你意料之外的东西。这应该是你作为防守式程序员的方法,针对用户输入,或者平常进入你的系统的各种东西。因为我们可以预料到意想不到的,尽量做到尽可能严格。断言你的输入值是你期望的。
The best defense is a good offense

进攻就是最好的防守

(将输入)列入白名单而不是把它放到黑名单中,例如,当验证图像扩展名时,不检查无效的类型,而是检查有效的类型,排除所有其余的类型。 在 PHP 中,也有无数的开源验证库来使你的工作更容易。

进攻就是最好的防守,控制要严格。[h2]使用数据抽象[/h2]

OWASP 十大安全漏洞 中的第一个是注入。这意味着有人(很多人)还没有使用安全工具来查询他们的数据库。请使用数据库抽象包和库。在 PHP 中你可以使用 PDO确保基本的注入保护。[h2]不要重复造轮子[/h2]

你不用框架(或微框架)? 你就是喜欢没有理由的做额外的工作。恭喜你!只要是经过良好测试、广受信任的稳定的代码,你就可以尽管用于各种新特性(不仅是框架)的开发,而不是只因为它是已经造好的轮子的缘故而重新造轮子。你自己造轮子的唯一原因是你需要一些不存在或存在但不适合你的需求(性能不佳,缺少的功能等)。

那个(使用框架)我们称它为智能代码重用,它值得拥有。[h2]不要信任开发人员[/h2]

防守式编程可以与称为防御性驾驶的东西相关。在防御驾驶中,我们假设我们周围的每个人都有可能犯错误。 所以我们必须小心别人的行为。这些同样适用于我们的防守式编程,作为开发者,我们不应该相信其他开发者。我们也同样不应该信任我们的代码。

在许多人参与的大项目中,我们可以有许多不同的方式来编写和组织代码。 这也可能导致混乱,甚至更多的错误。 这就是为什么我们统一编码风格和使用代码检测器会使我们的生活更加轻松。[h2]写SOLID代码[/h2]

这是对一个防守式程序员困难的地方,writing code that doesn’t suck。这是许多人知道和谈论的事情,但没有人真正关心或投入正确的注意力和努力来实现SOLID代码

让我们来看一些不好的例子。
[h2]不要:未初始化的属性[/h2]
[code]
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:8
帖子:5
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP