注册全局php

时间:2013-01-02 05:32:39

标签: php

我知道不应该使用寄存器全局变量而不能理解为什么?

例如:这是我经常发现的代码,用于演示在将example.com?authorized=1之类的内容传递给脚本时使用注册全局变量的安全风险:

if (authenticated_user()) 
{ 
$authorized = true; 
} 

if ($authorized) 
{ 
include '/highly/sensitive/data.php'; 
} 

我的问题是,如果用户必须在网址中传递authorized=1,他应该知道我在我的脚本中使用的变量名称,对吧?怎么可能?

同样不是像parse_str()这样的函数,其行为与注册全局变量有点类似,也存在安全风险?

4 个答案:

答案 0 :(得分:5)

  1. 攻击者可能通过其他安全漏洞或隐私泄露访问您的源代码。
  2. 攻击者可以猜到。构建一个机器人来枚举所有合理的变量名称并尝试对抗数千个php站点是非常简单的。 (?authorized=1?login=1?access=1等。)
  3. 修改

    在回应parse_str时,它取决于用例究竟是什么,但通常可能。 如果parse_str传递任何用户提供的内容,那么是的,绝对是不安全的。

    可能存在一些合法的用例,其中提供的输入不是用户提供的,但一般情况下我会远离它。

    我也会对extracthttp://ca1.php.net/manual/en/function.extract.php

    说同样的话

答案 1 :(得分:2)

想一想为什么用authorized来命名你的变量?使描述对吗? 黑客在网址中使用词典单词,如果register_globals

,则会设置此类描述性变量

答案 2 :(得分:1)

虽然黑客确实需要知道变量名称,但在很多情况下,这些变量很容易被猜测,并且是一项微不足道的任务,试图暴力破解。

当您使用开源软件,插件或复制/粘贴热门代码段时,情况会变得更加真实。

答案 3 :(得分:1)

首先register_globals存在安全风险。

  • 它在PHP级别打开,所以你不能说打开引用只有一个脚本是安全的。
  • 程序员(可能是任何程序员而不仅仅是你)将不知道如何设置$authorized并且可能无意中在代码中留下了安全循环漏洞。
  • register_globals注册的变量为superglobals,表示它们可以在PHP脚本的任何范围内使用。

接下来我们来看parse_str。此函数仅将变量解析为代码(reference)的当前范围。任何程序员都可以查看当前范围并确定他们是否以及如何保护它。它仍然不是很安全,但并不像register_globals那样不安全。