PHP安全编程:网站安全设计的一些原则(转)

深度防范

深度防范原则是安全专业人员人人皆知的原则,它说明了冗余安全措施的价值,这是被历史所证实的。php

深度防范原则能够延伸到其它领域,不只仅是局限于编程领域。使用过备份伞的跳伞队员能够证实有冗余安全措施是多么的有价值,尽管你们永远不但愿主伞失效。一个冗余的安全措施能够在主安全措施失效的潜在的起到重大做用。数据库

回到编程领域,坚持深度防范原则要求您时刻有一个备份方案。若是一个安全措施失效了,必须有另一个提供一些保护。例如,在用户进行重要操做前进行从新用户认证就是一个很好的习惯,尽管你的用户认证逻辑里面没有已知缺陷。若是一个未认证用户经过某种方法假装成另外一个用户,提示录入密码能够潜在地避免未认证(未验证)用户进行一些关键操做。编程

尽管深度防范是一个合理的原则,可是过分地增长安全措施只能增长成本和下降价值。浏览器

最小权限

我过去有一辆汽车有一个佣人钥匙。这个钥匙只能用来点火,因此它不能打开车门、控制台、后备箱,它只能用来启动汽车。我能够把它给泊车员(或把它留在点火器上),我确认这个钥匙不能用于其它目的。安全

把一个不能打开控制台或后备箱的钥匙给泊车员是有道理的,毕竟,你可能想在这些地方保存贵重物品。但我以为没有道理的是为何它不能开车门。固然,这是由于个人观点是在于权限的收回。我是在想为何泊车员被取消了开车门的权限。在编程中,这是一个很很差的观点。相反地,你应该考虑什么权限是必须的,只能给予每一个人完成他本职工做所必须的尽可能少的权限。服务器

一个为何佣人钥匙不能打开车门的理由是这个钥匙能够被复制,而这个复制的钥匙在未来可能被用于偷车。这个状况听起来不太可能发生,但这个例子说明了没必要要的受权会加大你的风险,即便是增长了很小权限也会如此。风险最小化是安全程序开发的主要组成部分。网络

你无需去考虑一项权限被滥用的全部方法。事实上,你要预测每个潜在攻击者的动做是几乎不可能的。spa

简单就是美

复杂滋生错误,错误能致使安全漏洞。这个简单的事实说明了为何简单对于一个安全的应用来讲是多么重要。没有必要的复杂与没有必要的风险同样糟糕。.net

例如,下面的代码摘自一个最近的安全漏洞通告:code

1 <?php
2       
3     $search = (isset($_GET['search']) ? $_GET['search'] : '');
4   
5 ?>

这个流程会混淆$search变量受污染*的事实,特别是对于缺少经验的开发者而言(注:受污染变量,即在程序执行过程当中,该变量的值不是由赋值语句直接指定值,而是来自其它来源,如控制台录入、数据库等。)。上面语句等价于下面的程序:

01 <?php
02   
03   $search '';
04   
05   if (isset($_GET['search']))
06   {
07         $search $_GET['search'];
08   }
09   
10 ?>

上面的两个处理流程是彻底相同的。如今请注意一下下面的语句:

1 $search $_GET['search'];

使用这一语句,在不影响流程的状况下,保证了$search变量的状态维持原样,同时还能够看出它是否受污染。

暴露最小化

PHP应用程序须要在PHP与外部数据源间进行频繁通讯。主要的外部数据源是客户端浏览器和数据库。若是你正确的跟踪数据,你能够肯定哪些数据被暴露了。Internet是最主要的暴露源,这是由于它是一个很是公共的网络,您必须时刻当心防止数据被暴露在Internet上。

数据暴露不必定就意味着安全风险。但是数据暴露必须尽可能最小化。例如,一个用户进入支付系统,在向你的服务器传输他的信用卡数据时,你应该用SSL去保护它。若是你想要在一个确认页面上显示他的信用卡号时,因为该卡号信息是由服务器发向他的客户端的,你一样要用SSL去保护它。

好比前面的例子,显示信用卡号显然增长了暴露的机率。SSL确实能够下降风险,可是最佳的解决方案是经过只显示最后四位数,从而达到完全杜绝风险的目的。

为了下降对敏感数据的暴露率,你必须确认什么数据是敏感的,同时跟踪它,并消除全部没必要要的数据暴露。在本书中,我会展现一些技巧,用以帮助你实现对不少常见敏感数据的保护。

相关文章
相关标签/搜索