22 fevereiro 2010

Desabilitando o register_globals em tempo de execução

A diretiva register_globals há muito tempo é condenada pelos desenvolvedores mais experientes por possibilitar uma falha de segurança. Com essa configuração ativada, todas as variáveis contidas em $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER são automaticamente convertidas em variáveis do PHP.

Por exemplo ao acessar http://localhost/arquivo.php?variavel=teste, se o servidor estiver configurado com register_globals = On, no script arquivo.php, haverá uma variável chamada $variavel, que terá o valor 'teste'. Isso pode ser uma falha de segurança pois um atacante pode infiltrar códigos maliciosos em variáveis que não deveriam vir das fontes carregadas pelo register_globals.
Para piorar, no PHP 6 essa configuração não irá mais existir. Ou seja, se você utiliza register_globals em seu código, certamente terá que fazer alterações ao atualizar a versão.

Sabemos que no PHP algumas diretivas definidas no php.ini podem ser alteradas em tempo de execução através da função ini_set().
Porém a diretiva register_globals não pode ser desabilitada em tempo de execução.

Portanto há 2 maneiras de desabilitar essa configuração
1 - Alterar o php.ini, alterando a diretiva register_globals para Off
2 - Criando um arquivo .htaccess no servidor alterando essa configuração para Off

Porém, como nem tudo são flores, há situações na qual não temos acesso a essas configurações do servidor. Para essas situações há uma maneira simples de garantir que as variáveis passadas por $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER não serão transformadas em variáveis PHP.

No início do programa adicione as seguintes linhas:

foreach ($_ENV as $key => $value)
unset($$key);
foreach ($_GET as $key => $value)
unset($$key);
foreach ($_POST as $key => $value)
unset($$key);
foreach ($_COOKIE as $key => $value)
unset($$key);
foreach ($_SERVER as $key => $value)
unset($$key);

Fazendo isso você, antes de iniciar o desenvolvimento, está limpando as variáveis carregadas automaticamente.
Desta forma o desenvolvedor fica impossibilitado de utilizar as "vantagens" de register_globals e garante que o código será compatível com a nova versão do PHP.

Obs.: As variáveis ainda poderão ser acessadas normalmente pelos arrays superglobais do PHP $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER

Obs.: Lembrando que essa técnica nada mais é que um Recurso Técnico Improvisado(Workaround, Gambiarra, Quebra-Galho...), mas que funciona!

Nenhum comentário:

Postar um comentário