为什么REGISTER_GLOBALS如此糟糕?

RCI*_*CIX 14 php register-globals

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

sou*_*rge 14

REGISTER_GLOBALS意味着通过GET或POST传递的所有变量都可以作为脚本中的全局变量使用.由于访问未声明的变量不是PHP中的错误(这是一个警告),它可能导致非常恶劣的情况.考虑一下,例如:

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

这本身并不是一件坏事(精心设计的代码不应该生成警告,因此不应该访问任何可能未声明的变量(并且不应该 REGISTER_GLOBALS出于同样的原因)),但PHP代码通常[非常]低质量,导致这种安全漏洞.

  • "PHP代码通常[非常]低质量" - 为自己说话 (21认同)
  • 通常!=总是.但我建议你浏览一些开源CMS的来源.你会发现比你想象的更多`eval()`,`erege_replace()`和`REGISTER_GLOBALS`.注意:我自己是一名php开发人员. (5认同)

pav*_*ium 9

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

启用它后,URL末尾的任何查询字符串:

http://yourdomain/something.php?valid=true 
Run Code Online (Sandbox Code Playgroud)

会影响something.php中变量$ valid(例如)的值(如果存在).

如果你使用公开可用的PHP代码(例如一个库),变量的名称是众所周知的,并且黑客可以通过在查询字符串中分配值来控制它们的值.他们可能可以绕过身份验证.

即使您没有使用公共代码,也可以猜测重要变量的名称,并控制它们的值.

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

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