我很难理解这个功能。我知道 register_globals 是什么以及它从 PHP 中贬值了多长时间,但我正在查看这段代码,我想,里面有什么?...
<?php
//Undo register_globals
function unregister_globals() {
if (ini_get(register_globals)) {
$array = array('_REQUEST', '_SESSION', '_SERVER', '_ENV', '_FILES');
foreach ($array as $value) {
foreach ($GLOBALS[$value] as $key => $var) {
if ($var === $GLOBALS[$key]) {
unset($GLOBALS[$key]);
}
}
}
}
}
?>
我不明白的部分是这个......
foreach ($array as $value) {
foreach ($GLOBALS[$value] as $key => $var) {
if ($var === $GLOBALS[$key]) {
unset($GLOBALS[$key]);
}
}
}
这个 foreach 循环循环遍历我们定义的 $array 中的每个值,然后内部 foreach 循环从 GLOBALS 中获取一个超级全局数组,无论它是 _REQUEST、_SESSION、_SERVER、_ENV、_FILES 等......检查 $var 是否等于 GLOBAL 变量或不等于。如果是这样,那么我们将取消设置。
但是我仍然很难解决这个问题......
更新 这是我正在试验和调试的代码片段。如果 register_globals 处于打开状态,并且黑客来了,将 ?auth=1 插入到查询字符串中,会发生什么?auth 会从 GLOBALS 中删除还是会被回显?
if( true ) {
$globals = array(
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'_SERVE',
'_SESSION'
);
foreach($globals as $global) {
foreach($GLOBALS[$global] as $k => $v) {
/* $GLOBALS['_GET'] on the first loop; */
/* IF WE SAY, $GLOBALS['app_dir'], WE GET THE VALUE */
if( $v == $GLOBALS[$k] ) {
echo "K=> " . $k . "<br />";
echo "V => " . $v . "<br />";
echo "GLOB => " . $GLOBALS[$k] . "<br />";
}
}
}
echo $authorized; // a intentional non-defined variable
//print_r($GLOBALS);
}
谢谢你的时间。