Работа с Register_Globals
-
19-09-2019 - |
Вопрос
Я не уверен, было бы хорошо, чтобы быть отмеченным как общественное вики, но в любом случае:
Есть ли простой способ убить register_globals? Я работаю над PHP -структурой, и прямо сейчас я просто установил сценарий для завершения, если включен Register_Globals. Хотя я предпочитаю заставить людей отключить его, там находятся серверы, на которых все еще есть.
Я знаю, что в PHP 5.3.0 Register_Globals устарел, и в PHP 6 он будет полностью удален, но всегда хорошо справиться с ним, пока он еще здесь.
Я видел несколько способов, и сейчас я думаю об этом:
$temp = array_merge($_GET, $_POST, $_COOKIE); foreach($temp as $k => $v) { if(isset($$k)) unset($$k); }
Однако здесь есть некоторые проблемы. Это стимулирование ресурсов, особенно когда есть много входных данных. Я не уверен, будет ли отключить его во время выполнения, например:
ini_set('register_globals', 'Off')
Есть ли лучший способ, о котором я не слышал, чтобы избавиться от Register_Globals? Спасибо.
Решение
Есть методы борьбы с register_globals описано в руководстве PHP. Анкет А register_globals
настройка INI не может быть установлен во время выполнения по ini_set()
, Поэтому, если вы не можете сделать это с помощью файла .htaccess или веб -сервера, метод, при условии, что это будет официальный обходной путь.
Он в основном предоставляет этот фрагмент кода для эмуляции совместимости:
<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
if (!ini_get('register_globals')) {
return;
}
// Might want to change this perhaps to a nicer error
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Variables that shouldn't be unset
$noUnset = array('GLOBALS', '_GET',
'_POST', '_COOKIE',
'_REQUEST', '_SERVER',
'_ENV', '_FILES');
$input = array_merge($_GET, $_POST,
$_COOKIE, $_SERVER,
$_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
foreach ($input as $k => $v) {
if (!in_array($k, $noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
unregister_GLOBALS();
?>
Другие советы
Вы могли бы добавить php_flag register_globals off
В ваш файл .htaccess, хотя не все серверы принимают это. Так что, если вы планируете опубликовать свою структуру, это может быть не хорошей идеей.