Работа с register_globals - PullRequest
       14

Работа с register_globals

4 голосов
/ 08 января 2010

Я не уверен, было бы хорошо, чтобы это было отмечено как вики сообщества, но в любом случае:

Есть ли простой способ убить register_globals? Я работаю над PHP Framework и прямо сейчас, я просто установил скрипт для завершения, если 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? Спасибо.

Ответы [ 2 ]

4 голосов
/ 08 января 2010

Существуют методы работы с 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();

?>
3 голосов
/ 08 января 2010

Вы можете добавить php_flag register_globals off в свой файл .htaccess, хотя не все серверы принимают это.Так что, если вы планируете опубликовать свой фреймворк, это может быть плохой идеей.

...