Lidando com register_globals
-
19-09-2019 - |
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.
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.