我知道不应该使用寄存器全局变量而不能理解为什么?
例如:这是我经常发现的代码,用于演示在将example.com?authorized=1
之类的内容传递给脚本时使用注册全局变量的安全风险:
if (authenticated_user())
{
$authorized = true;
}
if ($authorized)
{
include '/highly/sensitive/data.php';
}
我的问题是,如果用户必须在网址中传递authorized=1
,他应该知道我在我的脚本中使用的变量名称,对吧?怎么可能?
同样不是像parse_str()
这样的函数,其行为与注册全局变量有点类似,也存在安全风险?
答案 0 :(得分:5)
?authorized=1
,?login=1
,?access=1
等。)修改强>
在回应parse_str
时,它取决于用例究竟是什么,但通常可能。
如果parse_str
传递任何用户提供的内容,那么是的,绝对是不安全的。
可能存在一些合法的用例,其中提供的输入不是用户提供的,但一般情况下我会远离它。
我也会对extract
:http://ca1.php.net/manual/en/function.extract.php
答案 1 :(得分:2)
想一想为什么用authorized
来命名你的变量?使描述对吗? 黑客在网址中使用词典单词,如果register_globals
在
答案 2 :(得分:1)
虽然黑客确实需要知道变量名称,但在很多情况下,这些变量很容易被猜测,并且是一项微不足道的任务,试图暴力破解。
当您使用开源软件,插件或复制/粘贴热门代码段时,情况会变得更加真实。
答案 3 :(得分:1)
首先register_globals
存在安全风险。
$authorized
并且可能无意中在代码中留下了安全循环漏洞。register_globals
注册的变量为superglobals
,表示它们可以在PHP脚本的任何范围内使用。接下来我们来看parse_str
。此函数仅将变量解析为代码(reference)的当前范围。任何程序员都可以查看当前范围并确定他们是否以及如何保护它。它仍然不是很安全,但并不像register_globals
那样不安全。