Possuo uma plataforma Windows com uma aplicação em PHP. Ao clicar em itens do site, sempre visualizo a mesma página. O que fazer?
Em alguns casos, aplicações web desenvolvidas com técnicas que já encontram-se em desuso, podem apresentar este comportamento.
Uma das funções mais comuns que são chamadas por aplicações que apresentam este quadro é o "register_globals"(Register Globals).
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");
}
?>
</font></div>
</td>
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
neste 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");
}
?>
</font></div>
</td>
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).