Você está na página 1de 5

Segurança em

PHP
Há de se dizer por alguns que o PHP está obsoleto, morto
como Homem de Ferro (se isso foi um spoiler pra você,
sinto muito mas vá se atualizar), porém lhe digo que essa
linguagem presente desde 1995 está longe de nos deixar.

Segundo estatisticas do W3 Techs, que é atualizado


diariamente, no dia 4 de novembro de 2021, data em que
escrevo esse artigo, o PHP é usado por 78,4% de todos
os sites em que a linguagem de programação server-side
é conhecida.

Usage Statistics and Market Share of PHP for


Websites, November 2021 (w3techs.com

Então quando falamos de uma linguagem presente na


vasta maioria das aplicações web que utilizamos hoje
em dia, por que não falar sobre melhores práticas de
segurança em PHP?

Antes de começarmos, é bom dizer que historicamente o


PHP tem um certo desgosto por parte da comunidade dev.
Isso acontece porque estamos falando de uma linguagem
que foi criada para ser fácil de utilizar, e com isso algumas Imagem retirada do reddit, Alexander Lane (u/
boas práticas de padrões de código e design podem não faisalhassanx) - Reddit
ser utilizadas, o que torna muito fácil o surgimento de User: faisalhassanx
falhas de segurança. Tais falhas que espero te ajudar a dar Postado em: 11/05/2017
uma maior atenção. Acessado em: 04/11/2021

2 Segurança em PHP
1 PHP ini
• disable_functions = string
Pode ser uma boa desabilitar funções nativas do
PHP que sua aplicação não precisa usar, por exemplo
exec, shell_exec, system...
Começamos com o core do PHP, o local em que as
principais configurações estão localizadas – php.ini • open_basedir = string
Nele é possível setar algumas flags de configurações Nesta flag deve ser informada o diretório base
que o PHP deverá seguir durante a execução. Dentre da aplicação para impedir que seja acessado ou
essas flags, temos algumas importantes pare melhorar a executado arquivos que possam estar em outros
segurança da sua aplicação: diretórios. Para exemplificar, vamos supor que sua
aplicação tenha algo como:
• display_errors = off
readfile($_GET[‘file_path’]);
Tendo isso habilitado, o PHP não exibirá os erros que
aconteceram durante a execução na tela do usuário. Sem essa flag configurada corretamente, o
O que é recomendado em ambientes de produção, usuário poderia acessar diversos arquivos no
uma vez que se o usuário ter acesso a essas sistema passando no ‘file_path’ o caminho do
mensagens fica mais fácil um ataque direcionado ou arquivo que ele quer.
exploração daquele bug/vulnerabilidade.
• allow_url_fopen = off
• log_errors = on
Isso evita a execução de arquivos PHP remotamente,
Seguindo essa linha de erros, é importante estar no exemplo de seu código ter:
com essa flag habilitada pois log é informação e
file_get_contents($_POST[‘url’])
informação é ouro!
O usuário poderia passar um caminho de
arquivo ou uma URL maliciosa, parecido com a
flag anterior.

Segurança em PHP 3
2 Inputs de usuários
• Cross-Site-Scripting (XSS)
É um tipo de injection que ocorre com a execução
de scripts maliciosos a partir do que foi informado
no input.
Uma frase que eu gosto muito é “Nunca confie nos
inputs do usuário!”, nem precisa de explicações né? Para esse ataque, o PHP também possui funções
que podem auxiliar como strip_tags() ou
Sempre que possível, é importante aplicar regras no htmlspecialchars().
próprio field/model/classe para que o input seja validado

3 Logs
antes de bater no servidor, uma vez no servidor essas
dicas abaixo podem te salvar!

Dependendo da forma que implementamos nossas


funções, pode ser que comandos maliciosos passem, é aí
Log é informação e informação é ouro!
que entram dois tipos de vulnerabilidades:
A pior coisa é quando um usuário reporta um bug ou
• SQL Injection
erro que não conseguimos replicar, ou pior, que não
Ocorre quando o usuário informa uma query no conseguimos identificar o que aconteceu. Agora imagina
input, que quando processada é interpretada pelo quando ocorre uma falha de segurança, um acesso
banco de dados, podendo retornar informações indevido, ou vazamento de dados e não temos o mínimo
sensíveis. de informações de como isso aconteceu!

Para evitar a execução desse tipo de ataque, algumas Por isso é de extrema importância mantermos log
funções nativas do PHP podem ser utilizadas, como do que acontece no sistema, principalmente nas
por exemplo mysql_real_escape_string(), sqlite_ partes mais sensíveis, com o máximo de detalhes que
escape_string() ou str_replace(). pudermos.

4 Segurança em PHP
Um exemplo de uma escrita de log poderia ser: $key = random_bytes(SODIUM_CRYPTO_
SECRETBOX_KEYBYTES);
$log = “[“ . $action . “] [“ . date(“d-m-Y H:i:s”) .
“]” . PHP_EOL. $nonce = random_bytes(SODIUM_CRYPTO_
SECRETBOX_NONCEBYTES);
“User “ . $user . “ IP “ . $SERVER[‘REMOTE_
ADDR’] . PHP_EOL. //criptografar
“---” . PHP_EOL; $cipher = sodium_crypto_secretbox($message,
$nonce, $key);
file_put_contents(“./logs/mylogs.log”, $log,
FILE_APPEND); //descriptografar
$plaintext = sodium_crypto_secretbox_

4 Criptografia open($cipher, $nonce, $key);


//agora é só testar
echo $plaintext == $message ? “Deu bom” :
“Deu ruim”;
Quando se trata de informações sensíveis, podemos
aplicar uma segurança a mais na comunicação. Mais simples que isso é só pisar no pé de um Hobbit.
Uma sugestão que deixo pra você é o uso de uma Um bom coding pra você!
biblioteca chamada Libsodium, que pode ser utilizada
para criptografar, descriptografar, hash de senhas, entre
outros.

E o melhor de tudo: é tão fácil de usar que você não


precisa ser um expert em segurança. Veja no exemplo: Gostou do conteúdo?
$message = “Hakuna matata!”; Aproveita e siga a Trend Micro nas redes sociais!

//gerar uma chave secreta e um número único

Segurança em PHP 5

Você também pode gostar