谨慎使用register_globals:避免PHP安全漏洞
register_globals 是 PHP 中的一个非常显著但也备受争议的功能,其可将所有从 URL、表单以及 cookie 中获得的变量直接赋值到全局变量中,即使它们未经过处理。虽然 register_globals 在某些情况下可以使代码更易于编写和维护,但使用它也会导致很多安全风险。本文将为大家介绍 register_globals 的原理和存在的安全漏洞,并提供一些解决方案,以协助您避免这些风险。
register_globals 的工作原理
register_globals 的工作机制非常简单。如果将其设置为 on,当您通过 URL、表单或 cookie 中获得一个变量的值时,该变量将被赋值到相应的全局变量中。例如,若用户名和密码分别在表单字段中为 "username" 和 "password",它们将被注册成功,并赋给全局变量。也就是说,您可以在整个脚本中使用 $_POST['username'] 和 $_POST['password'] 来访问这些变量的值。
register_globals 的安全漏洞
尽管 register_globals 的工作原理不错,但其也存在许多安全风险,其中包括以下三项:
1. 全局变量的混淆
由于 register_globals 已将变量名称直接映射到全局变量,恶意用户可以传递一个名为 $_SESSION 或 $_REQUEST 等的变量,从而覆盖原本需要被保护的全局变量。
2. SQL 注入
register_globals 可能会将客户端提交的数据直接赋值给全局变量,这也是 SQL 注入的一个根本原因。这意味着恶意脚本可以利用此方法发送 SQL 查询,这些查询将被传递到数据库中,而这些查询可能会破坏或盗取您的数据。
3. 脚本注入
register_globals 也可能被用来操纵 PHP 的对象、函数和类。例如,黑客可能会操纵一些敏感变量,从而导致脚本的意外行为,甚至在某些情况下可让攻击者完全控制您的服务器。
register_globals 安全解决方案
为了解决 register_globals 带来的安全风险,您可以采取以下三种措施:
1. 将 register_globals 关闭
register_globals 应该始终被关闭。如果您的代码库还在使用它,请务必更改相关配置。在最新版本的 PHP 中,register_globals 已被移除,所以如果您使用较老的 PHP 版本请务必升级至新版本。
2. 利用超全局变量
超全局变量使您可以轻松访问参数和全局变量,而不必使用 register_globals。超全局变量是在 PHP/superglobals 中声明的,例如 $_SERVER、$_GET、$_POST、$_COOKIE 和 $_SESSION。当PHP脚本运行时,超全局变量始终在作用域中可用。
3. 过滤和验证输入
无论您是否采用了超全局变量的解决方案,始终要过滤和验证输入值。您可以通过标准的表单验证来确保表单中的所有输入都符合您所期望的格式。还可以使用 PHP 提供的一些输入过滤器来确保输入值都是有效的。
总结
register_globals 的安全风险很多。如果您使用PHP编写网页,并希望将其安全性提升到一个新的水平,关闭 register_globals 是首要任务。此外,过滤和验证输入数据也是很重要的。在编写 PHP 代码时,您应该时刻关注您的代码中所有变量的来源和使用,并且根据需要选择适当的解决方案来保护您的代码和用户数据。