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