PHP 是一款功能强大且灵活的工具。这种强大和灵活来自 PHP 构建于数十个不同的第三方库之上的非常精简的框架。每个库都有其独特的输入数据特性。可能安全传递给一个库的数据可能不安全传递给另一个库。
很久以前,一位名为 NeverEverSanity 的网络蠕虫暴露了流行的 phpBB 论坛应用程序中输入验证的一个错误。他们的高亮代码没有正确处理双重 URL 编码的输入。如果未对不受信任的用户数据进行适当的输入验证,并结合任何可以执行代码或写入文件系统的 PHP 调用,就会产生潜在的安全问题。尽管围绕一些无关的 PHP 安全修复程序和 NeverEverSanity 蠕虫的时机存在一些混淆,但该蠕虫实际上与 PHP 中的安全问题无关。
当我们讨论 Web 应用程序中的安全性时,实际上有两个类别:远程和本地。每个远程漏洞都可以通过非常仔细的输入验证来避免。如果您正在编写一个请求用户姓名和年龄的应用程序,请检查并确保您只获取预期中的字符。还要确保您获取的数据量不会超过您的后端数据存储或您可能传递这些数据的任何操作函数。远程漏洞的一种变体是 XSS 或跨站点脚本问题,其中一个用户输入一些 javascript 代码,然后下一个用户查看该代码。
对于本地漏洞,我们主要听到的是共享虚拟主机上的 open_basedir 问题。此功能作为系统管理员的便利而存在,绝不应被视为完整的安全框架。您可以将所有第三方库挂接到 PHP 中,以及可以欺骗这些库访问文件的各种创造性方法,因此无法使用此指令保证安全性。例如,Oracle 和 Curl 扩展都提供了通过库读取本地文件的方法。除非修改这些第三方库(对于闭源的 Oracle 库来说这将很困难),否则 PHP 实际上对此无能为力。
当您仅使用少量扩展的 PHP 时,open_basedir 通常足以让普通的坏人感到沮丧,但对于关键的安全情况,您应该使用操作系统级别的安全性,方法是运行多个 Web 服务器,每个服务器都使用其自己的用户 ID,并且理想情况下位于单独的隔离/chroot 文件系统中。更好的是,使用完全独立的物理服务器。如果您与不信任的人共享服务器,您需要意识到您永远无法实现绝对的安全。