Функция cot_unregister_globals в Cotonti
функция удаляет опасные глобальные переменные, созданные из пользовательских данных, для предотвращения уязвимостей.
Функция cot_unregister_globals проверяет, включена ли директива register_globals.
Если она включена, функция удаляет опасные глобальные переменные, созданные из пользовательских данных, для предотвращения уязвимостей.
Это особенно важно для старых версий PHP, где глобальные переменные могли быть автоматически созданы из данных запроса, что увеличивало риск атак.
/**
* Unregisters globals if globals are On
* @see http://www.php.net/manual/en/faq.misc.php#faq.misc.registerglobals
*/
function cot_unregister_globals()
{
// Проверяем, включена ли директива register_globals в конфигурации PHP
if (!ini_get('register_globals')) {
return;
}
// Если в запросах присутствует попытка перезаписать глобальную переменную GLOBALS, завершить выполнение
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Перечень переменных, которые не должны быть удалены
$noUnset = array('GLOBALS', '_GET',
'_POST', '_COOKIE',
'_REQUEST', '_SERVER',
'_ENV', '_FILES');
// Объединяем все входящие данные (GET, POST, COOKIE, SERVER, ENV, FILES, SESSION)
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
// Пройдем по всем ключам входных данных и удалим глобальные переменные, если они не в списке исключений
foreach (array_keys($input) as $k) {
if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
Разбор и комментарии:
Общее описание: Эта функция предназначена для безопасного удаления глобальных переменных, если в конфигурации PHP включена директива register_globals. Это необходимо для улучшения безопасности и предотвращения возможных уязвимостей.
Комментарии и пояснения:
Проверка директивы register_globals:
if (!ini_get('register_globals')) {
return;
}
Функция сначала проверяет, включена ли директива register_globals в конфигурации PHP с помощью функции ini_get('register_globals'). Если эта директива выключена, функция сразу завершает выполнение, так как в этом случае глобальные переменные уже не могут быть зарегистрированы.
Проверка попытки перезаписи глобальной переменной GLOBALS:
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
Это условие проверяет, была ли попытка перезаписать переменную GLOBALS в запросах (например, через $_REQUEST или $_FILES). Если попытка есть, выполнение прерывается с сообщением об ошибке. Это защита от потенциальных атак, когда злоумышленник пытается манипулировать глобальными переменными.
Перечень переменных, которые не следует удалять:
$noUnset = array('GLOBALS', '_GET',
'_POST', '_COOKIE',
'_REQUEST', '_SERVER',
'_ENV', '_FILES');
В этом массиве содержатся переменные, которые не должны быть удалены из глобального пространства. Это стандартные суперглобальные переменные PHP, такие как $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, а также сама переменная GLOBALS. Эти переменные важны для нормальной работы веб-приложения и не должны быть удалены.
Объединение всех входных данных:
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
Все данные, которые могут быть получены пользователем (из $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, а также из $_SESSION), объединяются в один массив $input. Это нужно для того, чтобы пройти по всем данным и удалить ненужные глобальные переменные.
Удаление глобальных переменных:
foreach (array_keys($input) as $k) {
if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
В цикле происходит перебор всех ключей объединенного массива $input. Для каждого ключа проверяется, не является ли он элементом массива $noUnset (то есть не нужно ли его оставлять в глобальном пространстве). Если переменная не содержится в списке исключений, она удаляется из глобального массива $GLOBALS.
Роль функции: Функция cot_unregister_globals предназначена для обеспечения безопасности веб-приложения, удаляя нежелательные или опасные глобальные переменные, которые могут быть установлены из пользовательских данных. Эта мера предостережения была особенно актуальна, когда в PHP была включена директива register_globals, так как она позволяла несанкционированно создавать глобальные переменные из данных запроса. Функция помогает защититься от возможных уязвимостей, вызванных этой настройкой.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 23.01.2025 11:18
- Последнее обновление: 23.01.2025 11:18