У меня проблемы с пониманием этой функции. Я знаю, что такое 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 циклически перебирает каждое значение в массиве $, который мы определили, а затем внутренний цикл foreach захватывает суперглобальный массив из GLOBALS, будь то _REQUEST, _SESSION, _SERVER, _ENV, _FILES и т. Д. проверка того, совпадает ли $ var с ГЛОБАЛЬНОЙ переменной или нет. Если так, то мы его отключим.
Но у меня все еще большие трудности с осознанием этого ...
ОБНОВЛЕНИЕ Вот фрагмент кода, с которым я экспериментирую и отлаживаю. Что произойдет, если 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);
}
Спасибо за ваше время.
foreach ($GLOBALS[$value] as $key => &$var)
- person EmmyS   schedule 07.12.2013foreach ($arr as &$value)
- без ключа. Пока снимаем обстановку, пользуемся ключом. Вот почему это работает. - person user4035   schedule 07.12.2013