Dados Enviados pelo Usuário
A maior fraqueza na maioria dos programas PHP não é inerente a
linguagem em si, mas meramente um problema de código escrito desconsiderando a
segurança. Por essa razão, você sempre deve investir um pouco de tempo
considerando as implicações de um certo pedaço de código, para ter certeza
que o dano possível se uma variável não esperada for submetida ao mesmo.
Exemplo #1 Uso Perigoso de Variáveis
<?php
// remove um arquivo do diretório home do usuário... ou talvez
// de outra pessoa?
unlink ($evil_var);
// Escreve registro do acesso... ou talvez uma entrada em /etc/passwd?
fwrite ($fp, $evil_var);
// Executa algo trivial... ou rm -rf *?
system ($evil_var);
exec ($evil_var);
?>
Você sempre deve examinar cuidadosamente seu código para se assegurar que
quaisquer variáveis sendo enviadas do navegador web estão sendo checadas
de maneira correta, e faz a si mesmo as seguintes perguntas:
-
Seu script só afetará os arquivos desejados?
-
Dados incomuns ou indesejados podem ser utilizados?
-
Esse script pode ser usado de maneiras não intencionadas?
-
Ele pode ser usado em conjunto com outros scripts de maneira
negativa?
-
As transações serão registradas adequadamente?
Respondendo essas perguntas adequadamente enquanto escrevendo o script,
ao invés de depois, previne a reescrita indesejada quando você
precisar aumentar a segurança. Começando com essa linha de raciocínio,
você não garante a segurança do seu sistema, mas pode ajudar
a aumentá-la.
Melhore a segurança desabilitando configurações de conveniência que obscurecem a origem,
validade ou integridade dos dados de entrada. A criação implícita de variáveis
e a entrada não verificada podem levar a vulnerabilidades como ataques de injeção e
manipulação de dados.
Recursos como register_globals
e
magic_quotes
(ambos removidos no PHP 5.4.0) contribuíram
para esses riscos criando variáveis automaticamente a partir da entrada do usuário e
escapando dados inconsistentemente. Embora não esteja mais no PHP, riscos semelhantes
persistem se o tratamento de entrada for mal gerenciado.
Habilite error_reporting(E_ALL) para
ajudar a detectar variáveis não inicializadas e validar a entrada. Use tipos estritos
(declare(strict_types=1),
introduzido no PHP 7) para reforçar a segurança de tipos, evitar conversões de tipos não intencionais
e melhorar a segurança geral.