Pregunta

No estoy seguro de si esto sería bueno ser marcado como wiki de la comunidad, pero de todos modos:

¿Hay una manera fácil de matar los registros_globals? Estoy trabajando en un marco de PHP y en este momento, acabo de configurar el script para terminar si registra_globals está activado. Aunque prefiero obligar a las personas a deshabilitarlo, allí son Servidores que todavía tienen eso puesto.

Sé que en PHP 5.3.0 Register_Globals está en desuso y en PHP 6 se eliminará por completo, pero siempre es bueno lidiar con eso mientras todavía está aquí.

Vi algunas maneras, y actualmente estoy pensando en usar esto:

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

Sin embargo, hay algunos problemas aquí. Es un incentivo de recursos, especialmente cuando hay muchos datos de entrada. No estoy seguro de si deshabilitarlo en el tiempo de ejecución funcionaría, por ejemplo:

ini_set('register_globals', 'Off')

¿Hay una mejor manera de que no haya oído hablar de deshacerse de Register_Globals? Gracias.

¿Fue útil?

Solución

Hay métodos para tratar con registro_globals descrito en el manual de PHP. los register_globals configuración ini no se puede configurar en tiempo de ejecución por ini_set(), entonces, si no puede hacerlo con un archivo de configuración .htaccess o del servidor web, el método proporcionado allí sería la solución oficial.

Básicamente proporciona este fragmento de código para emular la compatibilidad:

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

?>

Otros consejos

Podrías agregar php_flag register_globals off a su archivo .htaccess, aunque no todos los servidores aceptan esto. Entonces, si planea publicar su marco, puede que no sea una buena idea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top