Talvez a mudança mais controversa no PHP foi quando o valor padrão da diretiva do PHP register_globals passou de ON (Ligado) para OFF (Desligado) na versão 4.2.0. Era muito comum as pessoas dependerem da diretiva e muitas delas nem sabiam que ela existia e presumiam que era a maneira como o PHP funcionava. Essa página explica como alguém pode escrever código inseguro com essa diretiva, mas tenha em mente que a diretiva em si não é insegura, o uso incorreto dela é que é.
Quando ligada, a diretiva register_globals criará para seus scripts vários tipos de variáveis, como as variáveis oriundas de formulários HTML. Isso, combinado com o fato de que o PHP não requer inicialização de variáveis, significa que é mais fácil escrever código inseguro. Foi uma decisão difícil, mas a comunidade do PHP decidiu que, por padrão, essa diretiva deveria ser desabilitada. Quando habilitada, é possível usar variáveis sem saber ao certo de onde elas vieram. Variáveis internas que são definidas no script em si se misturam com dados enviados pelos usuários e desabilitando a diretiva muda isso. Vamos demonstrar um exemplo de uso incorreto de register_globals:
Quando register_globals estiver habilitada, sua lógica pode ser comprometida. Quando
desligada $authorized
não pode ser configurada via GET, então
estará correto, embora geralmente seja uma boa prática de programação
inicializar as variáveis primeiro. Por exemplo, no nosso exemplo acima nós podemos
executar primeiro $authorized = false. Dessa forma
o código funcionaria com register_globals ligada ou desligada, já que
os usuário não seriam autorizados a não ser que a autenticação tenha sucesso.
Outro exemplo é o quando usando sessions.
Quando a diretiva está ligada, nós também podemos usar
$username
no exemplo mas novamente é preciso
perceber que $username
também pode vir de outro lugar,
como via GET (através da URL).
Exemplo 29-2. Exemplo de uso de sessões com register_globals ligada ou desligada
|
Além disso tudo, é possível tomar medidas preventivas para avisar quando alguém
está tentando criação de variáveis falsas. Se você sabe de antemão de onde uma
variável deve vir, você pode verificar se os dados enviados estão
chegando de maneira incorreta. Embora isso não seja garantia
de que os dados não são forjados, torna necessário ao atacante
adivinhar o tipo certo de falsificação. Se você não se importar de onde os
dados vierão, você pode usar o array $_REQUEST
, que
contêm a mistura dos dados de GET, POST e COOKIE. Veja também a seção do manual
sobre como usar variáveis de fora
do PHP.
Exemplo 29-3. Detecção simples de falsificação de variáveis
|
É óbvio que só desligar register_globals não significa que seu código está seguro. Cada dado que é enviado deve ser validado de outras maneiras. Sempre valide os dados enviados pelos usuário e inicialize suas variáveis! Para checar por variáveis não inicializadas, você pode configurar error_reporting() para mostrar erros do nível E_NOTICE.
Para mais informações sobre emulação de register_globals como ligada ou desligada, veja esse FAQ.
Disponibilidade das superglobais:: Desde o PHP 4.1.0, os arrays superglobais como
$_GET
,$_POST
,$_SERVER
, etc. sempre estão carregados. Para mais informações, leia a seção do manual sobre superglobals