Pergunta

Não tenho certeza se isso seria bom ser marcado como wiki da comunidade, mas de qualquer maneira:

Existe uma maneira fácil de matar o registro_globals? Estou trabalhando em uma estrutura PHP e, no momento, basta definir o script para encerrar se o registro_globals estiver ativado. Embora eu prefira forçar as pessoas a desativá -lo, lá são Servidores que ainda têm isso.

Sei que no Php 5.3.0 Register_Globals está depreciado e no Php 6 será completamente removido, mas é sempre bom lidar com isso enquanto ainda está aqui.

Eu vi algumas maneiras e atualmente estou pensando em usar isso:

$temp = array_merge($_GET, $_POST, $_COOKIE);
foreach($temp as $k => $v) {
    if(isset($$k)) unset($$k);
}

Existem alguns problemas aqui, no entanto. É um incentivo de recursos, especialmente quando há muitos dados de entrada. Não tenho certeza se desativá -lo no tempo de execução funcionaria, por exemplo:

ini_set('register_globals', 'Off')

Existe uma maneira melhor que eu não ouvi falar de me livrar do Register_Globals? Obrigado.

Foi útil?

Solução

Existem métodos de lidar com o registro_globals descrito no manual PHP. o register_globals Configuração ini Não pode ser definido no tempo de execução por ini_set(), então, se você não puder fazer isso com um arquivo de configuração .htaccess ou servidor da web, o método desde que haja a solução alternativa oficial.

Basicamente, fornece este trecho de código para emular a compatibilidade:

<?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();

?>

Outras dicas

Você pode adicionar php_flag register_globals off ao seu arquivo .htaccess, embora nem todos os servidores aceitem isso. Portanto, se você planeja publicar sua estrutura, pode não ser uma boa ideia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top