Terça-feira, 09 de junho de 2009 às 11h00

Sobre o uso de “register_globals” no PHP 5

O uso de "register_globals" no mundo PHP é uma funcionalidade já considerada obsoleta. As últimas versões dos aplicativos mais comuns de código livre já não a utilizam mais.

Ao ativar esta configuração, além de trazer riscos ao seu site em termos de segurança, você adia a necessidade de um ajuste. Nas futuras versões do PHP, tal configuração não estará mais disponível, o que significa que inevitavelmente mais cedo ou mais tarde terá que adaptar o seu código fonte.

Existe uma alternativa transcrita abaixo para o uso de register_globals que apresenta o mesmo resultado que habilitar a configuração.

Um exemplo de uso comum do "register_globals" é para passar a informação de qual pagina deverá ser visualizada em um determinado menu ou botão. Isto é bastante comum principalmente em sites institucionais.

De modo mais técnico: Um site possui uma pagina principal "index.php" que internamente verifica o conteúdo da variavel "$pagina". Esta variável recebe o nome da página a ser acessada. Quando acessarmos http://dominio.com.br/index.php?pagina=contato, internamente a pagina "index.php" chamará a pagina "contato.php".

Supondo que o código original seja:

<?

if($pagina){

include ($pagina.".php");  /* risco de seguranca !!!!! */

}else{

include ("home.php");

}

?>

Com uma alteração no código fonte é possível adicionar uma linha que preencha o conteúdo da variavel "$pagina" com o parâmetro da url.

$pagina = $_REQUEST["pagina"];

Ao incluir a linha acima imediatamente antes da primeira utilização de "$pagina", podemos agora trabalhar com o register_globals desabilitado. Mas cuidado, ainda é necessário filtrar a variável para que a sua aplicação somente receba valores esperados.

Para mais detalhes sobre como se proteger de injeção de código malicioso via passagem de parâmetro, veja este tutorial. A proteção contra injeção no exemplo abaixo é meramente ilustrativo. Existem técnicas muito mais avançadas e completas para se proteger no link que passamos.

As alterações resultarão no seguinte:

<?
$pagina = $_REQUEST["pagina"];

/* use algum metodo de filtragem para evitar injeção de código */
if($pagina == "primeira" || $pagina == "segunda" || ...){
include ($pagina.".php"); /* variável filtrada na entrada */
}else{
include ("home.php");
}
?>


Nota: Por padrão, o register_globals do PHP 5 vem desativado tanto em nossa plataforma Linux como no Windows 2008, mas em último caso é possível habilitá-lo no .htaccess (Linux) ou por pedido via solicitação na web (Windows).

2 comentários

 Raphael Figa
10/06/2009 09h32

Muito bom, mas nem todos tem esta visão.

Parabéns Renato pelo artigo, então o maior problema é que para a marioria das pessoas pensam assim, bem ta funcionando então tá ótimo, coisa que eu acho errado.
Claro que leva tempo mas tempo é dinheiro que a empresa ou o profissional deixa de ganhar mas, eu sigo uma idéia que aprendi "melhor previnir do que remediar".

Abraço

 Gilberto Albino
10/06/2009 20h17

$_REQUEST e Fugindo do assunto de registers

Olá, eu não aconselho o uso de $_REQUEST em alguns casos onde eu sei que o dado vai vir em uma solicitação específica, como é o caso de $_GET['pagina'].
O assunto não se trata de manipulação de arquivos, mas gostaria de registrar isto aqui, pois muitos vão acabar usando este exemplo.
No caso, poderíamos verificar a existencia do arquivo sem precisar listar todos os arquivos em um array.
E como boa prática de arquitetura, os arquivos incluídos devem ser colocados em um diretório proprio, logo, somente os arquivos que forem usados estarão neste diretório:
Em todos os casos:
<?
$pagina = $_REQUEST["pagina"];

if( file_exists( "incluidos/" . $pagina . " . php" ) ){
include( $pagina . ".php" );
}else{
include( "incluidos/home.php" );
}
?>

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Renato Weiner é graduado em Engenharia Mecânica-Aeronáutica pelo ITA em 1994. Atua no mercado de tecnologia e internet desde 1995, tendo passado como empresas como Accenture (1994-1999), Locaweb (1999-2007). Atualmente é Diretor de Produtos e Tecnologia do UOL HOST, unidade de serviços de hosting do UOL.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.