章 15. 安全

PHP 是一种非常强大的语言,其解释器不管是作为 WEB 服务器的模块还是单独地以 CGI 程序的形式运行,都能够访问文件,执行命令,或者建立到服务器的网络连接。在默认情况下,这些特性给在 WEB 上运行的机制带来了安全隐患。针对这一问题,PHP 被设计成一种更加安全的语言,使得其跟 Perl 和 C 语言比起来,更适合用来编写 CGI 程序。加上其有良好的编译时和运行时设置选项以及适当的代码编写规则,PHP 能够为您找到您真正需要的自由与安全的结合点。

由于我们可以在很多不同的方面利用 PHP,因此它有很多设置选项来控制其行为。一组庞大的可选参数能够保证您可以将 PHP 用于许多不同的目的,但这同时也意味着这些参数和服务端配置的组合会带来一些安全问题。

PHP 的配置与其代码相比,有着同样的灵活性。PHP 可以用来建立完整的服务端应用程序,拥有所有外壳用户的权限;它也可以在被严格控制的环境下用作一个简单的服务端包含,仅承担很小的风险。您如何建立该环境,以及其安全性如何,在很大程度上取决于 PHP 的开发者。

本章将以一些总的安全建议开始,解释不同的配置选项组合以及它们能够被安全的使用的情况,然后针对不同的安全等级要求,描述一些在编写代码过程中采取的安全策略。

一般策略

一个绝对安全的系统是不可能实现的,因此一个安全策略的核心通常都是寻求风险与可用性之间的平衡点。如果用户提交的每个变量都需要两种生物统计学的校验(例如视网膜扫描和指纹检验),那么我们将会需要进行极其高阶的计算。这还可能造成我们需要花费半个小时来填写一个及其繁琐的表单,使得用户更倾向于寻找一些捷径来绕过这些安全机制。

最好的安全策略通常能够不那么明显地适应环境的需求,它不会妨碍用户完成他们的工作,也不会使代码编写员面过分负担复杂的情形。实际上,一些安全攻击的成功正是这种过分冗杂的安全机制随着时间逐渐毁坏的结果。

我们应该记住这样一句很有价值得话:一个系统充其量仅相当于一条锁链中最薄弱的环节。如果所有的事务的时间、地点、类型等信息都被详细的写入日志,但对用户的认证仅仅只是基于一个单一的 cookie,那么将用户记入事务日志的有效性就被严重地削弱了。

在测试的时候,请记住,即时是对最简单的页面,您也不可能测试到所有的可能性。您所预料到的输入可能和来自于一个不满的雇员,一个黑客用数月时间或者一只不小心踩到键盘的猫所进行的输入相去甚远。这也是为什么说我们最好能够从逻辑的全局上来审视我们的代码,从而辨别哪里出现不可预料的数据,然后再考虑如何修改、减少或者放大它们。

Internet 上充满了想试图通过破坏你的代码、黑掉你的网站、发布不适合的内容等途径来扬名立万的人。不管你的网站是大还是小,只要你在线,有一部可以连接得到的服务器,你就能成为目标。许多黑客程序并不分辩网站的大小,他们只是简单地在一大片 IP 范围内搜罗牺牲者。我们要尽可能不要使自己成为其中的一员。