【译】PHP中的防护性编程

菲纳格动态逆定律:php

会出错的,终将会出错 —- 在最糟糕的时刻。

clipboard.png

防护性编程是什么意思

防护性编程,简单的说,就是在编程的时候有目的地预测可能的故障点。目的是在那些可能发生的问题发生前解决它们。你看见了问题,对吧?预测意料以外的事情原本就有内在的难度,当你想要预测意料以外的事情而且解决它就更是难上了好几倍。html

下面咱们看几个实际的例子。前端

条件语句

这是最容易进行防护性编程的地方之一,也是最容易知足的地方。在用PHP编程的许多状况下你不会须要“else”。程序员

假设,你在写一个函数而且须要一个条件语句。在这里,你只须要为你特定的变量使用三个条件语句以下:数据库

if($var == a){ }
else if($var == b){ }
else if($var == c){ }

没有其余可能性了,你说,而且继续码代码。可是,让咱们在这里停一下。我知道你知道这里没有其余可能性了。而且我相信你。但有时候(不可预测的)状况会发生。咱们忘掉了一些状况。咱们检查错误。咱们最终重用了一些代码,超出了本来的预约范围。忽然咱们有了泄露错误或者有时候是静默的错误状态,由于咱们没有使用catch。使用else代码块。在使用switch时要使用default。用它们来返回或者记录错误,这样你才知道发生了什么(若是发生了的话)。虽然会多用两行代码,但当一些你没法预测的事情发生时,这是值得的。编程

毫不相信用户输入

你之前有没有据说过这个说法?大多数程序员听过。这有一点含糊,通俗点讲,理所固然。但它是真理。你毫不应该相信用户输入。这不是说你假设全部用户是疯狂的黑客,他们使用一些精心设计的命令来摧毁你的应用。没有必要妄想。可是,你应该假设用户不知道你的代码,他们不知道你须要填写什么参数,或者参数应该多长。他们不知道什么文件类型或者什么大小能上传(即便应用告诉了他们)。偶尔他们会是机器或者黑客而且他们但愿在他们的输入中运行脚本,有时候甚至是在登录后的输入中。你怎么知道你能相信认证或者验证码能在用户输入以前提供一个安全的堡垒?后端

答案:毫不。安全

你毫不相信用户输入。若是你信任的用户输入,那么你永远不会有一个突破。明白了吗?因此老是要评估你的输入,必定要保证你在处理数据尤为是要存入数据库或者要把它展现出来时使用了合适的技术。所以 – 毫不相信输入,即便来自不是用户的输入的地方 – 输入验证永远是你的朋友。看看Survive the Deep End: PHP Security 而且使用 validation library.吧。函数

对你的代码的假设

不要假设任何事情。若是前两个主题教会咱们一些事情的话,那就是咱们不该该作任何假设。做为程序员,尤为是致力于一个项目过久后,咱们开始作不少假设。咱们假设用户知道一些咱们知道的事情。不必定是技术细节,也能够是程序的功能性细节。咱们假设用户知道文件能有多大由于。。。咱们已经知道。或者他们知道为了让邮件脚本。。。但事实不是,他们不知道以上任何东西。这好像更多的是前端的工做,但明显的是你在后端仍然要处理用户行为和用户输入,因此值得好好想一想。编码

另外一个许多程序员都会作的惊人的假设是咱们在任什么时候候对于咱们的函数,类或者其它代码段的明显的功能属性。一个具备防护性的程序员会仔细考虑的不只仅是用通常的文档来描述函数是干什么的——他们也将写下他们对输入,参数,用例,或任何其余相似的东西作出的任何假设。由于咱们都是人,咱们过一段时间会忘掉一些事。咱们最后也极可能会面临其余人维护,扩展或者替换咱们的代码。若是没有别的,回想一下,编程是发生在一个充满技术变革的世界里。若是你的应用仍然能使用几年,可能会升级PHP版本而且失去一些功能,或者一些你本身代码里面具备交互的组件之间须要改变。预测这些是很困难的,因此好的注释和文档是很是重要的。

视野狭窄

另外一件可使咱们忘记好的评论实践以及标准的东西是视野狭窄。许多程序员都具备视野狭窄的毛病。你知道这种感受 - 你解决问题,你处于最佳状态。你以为与你的音乐(或没有)独立于本身的小世界中,而且你就在编码,忽然两小时过了,你意识到你已经写了无数行没有注释的代码。咱们全部人偶尔都会遇到这种事情,但重要的是在某处发现这个状况而且补上应有的注释。

语法和命名的一致性

一致性是一个灰色地带 – 它更多的是关于编码标准之类的,但它和防护性编程也有联系。在PHP中,有标准规范你的代码格式以便别人查看,或者你之后使用。但经常没人让你的代码标准化。可是不管你是否按照标准编码,你至少要保持一致性 – 这能让你少犯错误。这对于须要大量时间返回而且修复的小的语法错误尤为适用。若是你老是使用相同的间隔,格式和语法,命名规格等等你就能更好的避免犯错以致于误读你本身的代码。你更可能快速浏览代码而且找到你须要的东西。

总结

总的来讲,除去用户行为和动做,不要对你的程序作任何假设。假设是具备防护性编程习惯的程序员最大的敌人。不要假设你不须要 default 语句或者 else 代码块。尽可能使用正确的用户错误信息,警告,日志或者任何其它你假设不会用到的代码。你的假设一般是正确的 – 但咱们不在意。咱们在意的是它们出错的时候。必定要计划得好,准备着你可能须要在几小时,几周,几个月甚至几年后回顾你的代码,或者其余人须要 – 相应的就要好好写文档。别假设它永远不须要升级,扩展或者维护。那是无知的,在更多的状况下是疏忽。有时候保持一颗防护性编程的心能帮你更有效更安全地估计,计划和编程。

相关文章
相关标签/搜索