A maior fraqueza na maioria dos programas PHP não é inerente à 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.