O register_globals foi removido no PHP 5.4 e não dá mais para ativar. Veja como identificar o problema e corrigir um site antigo para rodar no PHP 8.
O register_globals era uma opção do PHP que transformava automaticamente tudo o que chegava pela URL, por formulário ou por cookie em variáveis comuns. Se alguém acessasse pagina.php?nome=Ana, o script já recebia uma variável $nome com o valor "Ana", sem precisar ler $_GET['nome'].
Parece prático, mas era uma falha de segurança grave: qualquer visitante podia criar ou sobrescrever variáveis do script só mudando a URL. Um pagina.php?logado=1 bastava para enganar muitos sistemas de login da época.
Dá para ativar o register_globals hoje?
Não. A diretiva foi marcada como obsoleta no PHP 5.3 (2009) e removida no PHP 5.4, lançado em março de 2012. Do PHP 5.4 em diante ela simplesmente não existe, então:
- a linha
php_flag register_globals onno.htaccessnão faz nada (no LiteSpeed é ignorada; em servidores com PHP-FPM ainda causa Erro 500); - não há opção para isso no Select PHP Version nem no MultiPHP INI Editor do cPanel;
- o mesmo vale para
register_long_arrays(as antigas$HTTP_POST_VARSe$HTTP_GET_VARS) e para omagic_quotes_gpc, removidos na mesma versão.
A única forma de "religar" seria rodar o site em PHP 5.3 ou anterior, uma versão sem nenhuma correção de segurança desde agosto de 2014. Em 2026 isso é pedir para o site ser invadido. O caminho é corrigir o código.
Como saber se o seu site depende do register_globals
Os sintomas típicos depois de trocar a versão do PHP:
- formulários que "não enviam nada", buscas que sempre voltam vazias e paginação que não sai da página 1;
- login que não funciona mesmo com a senha certa;
- no arquivo
error_logda pasta do site, em cPanel » Metrics » Errors ou na própria tela, avisos comoWarning: Undefined variable $nome(no PHP 7 o texto éNotice: Undefined variable: nome).
Na prática: o código usa $nome, $id ou $pagina sem nunca ter atribuído valor a elas, porque contava com o PHP criando essas variáveis sozinho.
Como corrigir o código para o PHP 8
- Faça um backup completo dos arquivos e do banco antes de mexer.
- Encontre as variáveis "soltas". Para cada aviso de variável indefinida, descubra de onde o valor deveria vir: da URL (
$_GET), de um formulário ($_POST), de um cookie ($_COOKIE) ou da sessão ($_SESSION). - Leia o valor da fonte certa, no início do script. Veja o antes e depois:
// ANTES (dependia do register_globals) echo "Resultado da busca por: $termo"; // DEPOIS $termo = $_GET['termo'] ?? ''; echo 'Resultado da busca por: ' . htmlspecialchars($termo); - Troque as variáveis longas antigas.
$HTTP_POST_VARSvira$_POST,$HTTP_GET_VARSvira$_GET,$HTTP_SESSION_VARSvira$_SESSIONe assim por diante. - Corrija a sessão. Funções como
session_register()também saíram no PHP 5.4. Usesession_start()e grave direto em$_SESSION['usuario'] = $usuario;. - Teste com os avisos ligados numa cópia do site e vá corrigindo até não sobrar nenhum.
extract($_REQUEST) no topo do site. Ele faz o site voltar a funcionar, mas devolve exatamente a mesma brecha de segurança. Se precisar usar para ganhar alguns dias, trate como provisório e tenha a correção definitiva já em andamento.E se o sistema for de terceiros?
Scripts muito antigos (sistemas de notícias, lojas e painéis de 2005 a 2010) costumam depender do register_globals em centenas de pontos. Nesses casos, quase sempre compensa mais migrar para uma versão atual do sistema ou para um CMS mantido, como o WordPress, do que remendar código sem suporte. Fale com o desenvolvedor original antes de decidir.
Perguntas frequentes
Posso desativar o register_globals por segurança?
Não precisa: em qualquer PHP a partir do 5.4 ele já não existe. Se o seu site roda numa versão mais antiga que isso, o problema real é a versão do PHP, não a diretiva.
O register_argc_argv também foi removido?
Não. O register_argc_argv continua existindo e só afeta scripts rodados na linha de comando. Ele não tem relação com formulários e não é causa dos problemas descritos aqui.