Sobre o uso de “register_globals” no PHP 5

3 de Junho de 2009 · 8 Comentários

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).

Compartilhe:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google

Tags: Desenvolvedores · Tecnologia · Webdesign

8 respostas até agora ↓

  • 1 Fábio // 13 de Junho de 2009 às 15:46

    O Problema e que muitos códigos ainda utilizam este arquivos como fórum ipb, joomla.

    Infelizmente

  • 2 Renato // 15 de Junho de 2009 às 13:52

    Fabio,
    Fizemos uma pesquisa e no joomla e ipb não é necessário. No joomla, veja a documentação - http://docs.joomla.org/Register_globals e no IPB, instalamos em um site nosso e funcionou sem modificações. Utilizamos as últimas versões disponíveis.
    Renato.

  • 3 CACA-[COBRA] // 16 de Junho de 2009 às 2:57

    $_REQUEST é coisa de amador :P

    $_GET/$_POST/$_COOKIE Rulez
    o/

  • 4 André aCidcOde Gomes // 16 de Junho de 2009 às 20:02

    Quem viveu na epoca dos defaces sabe o que isso causava, ja tava na hora de ser banido da face da terra.

  • 5 Fábio // 17 de Junho de 2009 às 0:31

    Melhor ainda Renato,

    Realmente verifiquei que o IPB não faz mais uso. Acho que lá pela versão 1.2 que fazia.

    Agradeço pelas informações.

  • 6 Raphael // 17 de Junho de 2009 às 9:43

    o $_REQUEST não sabe em quais caminhos veio tal variavel? se foi via GET ou POST?

    Acho muito mais útil usá-lo doque ficar colocando $_GETs e $_POSTs

  • 7 Vanduir Volpato Maia // 17 de Junho de 2009 às 10:25

    Um conserto fácil e seguro para caso seu script precise de register_globals:
    <?php

    $vars = array (’var1′,’var2′,’var3′); //coloque aqui as variáveis POST/GET/COOKIE/SESSION que irá precisar

    foreach ($vars as $var){
    if (isset ($_SESSION[$var]) ) $$var = $_SESSION[$var];
    elseif (isset ($_REQUEST[$var]) ) $$var = $_REQUEST[$var];
    }

  • 8 CACA-[COBRA] // 17 de Junho de 2009 às 15:04

    @Raphael

    if(isset($_REQUEST['login'])){
    $logado = true
    }

    Ai eu pego sei amado $_REQUEST e subscrevo com um GET

    ?login=1
    E já era kkkkkkkkk

Deixe um comentário