Segurança em PHP: o
que você precisa saber
Jota Júnior
Tolos ignoram complexidade, enquanto
pragmáticos sofrem com ela. Alguns até
conseguem evitar.
Gênios a removem.
Epigrams in Programming(http://www.cs.yale.edu/quotes.html)
Há duas formas de escrever programas sem erros;
só a terceira realmente funciona.
Epigrams in Programming(http://www.cs.yale.edu/quotes.html)
“Não confie em
estranhos.”
Sua mãe
Sempre haverá um
“ZzboladozZ”
Acreditem, já vi este nick! Ele se dizia “ráquer”
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
Uma boa fonte é mais importante do
que uma boa memória.
https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet
https://www.owasp.org/
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
SQL Injection
Um dado proveniente do usuário nunca
pode virar código diretamente.
SQL Injection
SQL Injection
SQL Injection
Existe o jeito complexo e o jeito
certo. A escolha é sua.
SQL Injection
E quando a query é dinâmica, ou existe
alguma limitação para os prepared
statements?
SQL Injection
SQL Injection
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
XSS
Cross-Site Scripting
- Permite inserir código que persiste na
página
- Usuário pode inserir código malicioso e
tornar seus outros usuários vítimas
XSS
<embed
src="http://www.orkut.com.br/GLogin.aspx
?cmd=logout"&gt;
XSS
Retirado do site da OWASP
Simples como essa função.
http://br2.php.net/htmlspecialchars
XSS
Novamente, várias ferramentas prontas
para facilitar.
Exemplo do framework CodeIgniter
(http://ellislab.com/codeigniter/user-guide/libraries/input.html)
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
CSRF
Chega de proteger o sistema.
Proteja também seu usuário.
CSRF
Cross Site Request Forgery
Permite forjar requisições, levando seu
usuário
a executar ações indesejadas.
CSRF
Como?
<a
href=”http://bancoruim.com/usuario/transferir/jota/1000”>
Download
</a>
CSRF
Você tem um controller que modifica determinado
dado quando requisitado.
Como saber que é uma requisição legítima?
CSRF
1- Crie um token aleatório e complexo, como chave de
segurança, provavelmente na hora da autenticação.
CSRF
2- Armazene este token também em uma sessão (ou
outra fonte de dados persistente similar, não acessível
ao usuário).
CSRF
3- Ao executar qualquer ação dentro do site, como
submeter um formulário em AJAX, envie também o
token (que pode estar guardado em um hidden input).
CSRF
4- Ao receber alguma requisição, verifique se o token
foi enviado e, caso tenha sido, se é igual ao
armazenado em sessão. Se não, negue.
CSRF
Outras considerações:
Complicações podem existir caso o token seja
previsível ou acessível (normalmente se existe outra
falha associada, como do navegador ou de sessão).
CSRF
Como o Facebook trata CSRF no PHP SDK:
https://github.com/facebook/facebook-php-sdk/blob/master/src/base_facebook.php
Passo 1 e 2: Cria token e guarda em sessão
CSRF
Passo 3: Envia o token estabelecido para a requisição
CSRF
Passo 4: Ao receber a requisição, verifica se o código
enviado é o mesmo da sessão
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
File Upload
Aquele upload de imagens inofensivo pode se tornar
uma grande dor de cabeça.
File Upload
Alguns dados, aparentemente confiáveis, podem ser
maliciosamente manipulados.
Entre eles, estão os cabeçalhos HTTP.
File Upload
Confira, sempre.
File Upload
Uma forma de verificar a imagem é verificando a
extensão
e o MIME-Type.
File Upload
A extensão é bem simples.
File Upload
O índice type do $_FILES traz o MIME-Type do arquivo,
mas o que ele diz ter. É manipulável e, portanto,
não pode ser utilizado.
File Upload
Código retirado do site da OWASP
Gasta mais recursos, mas faz uma verificação muito mai
confiável, pois obtém o real MIME-Type.
File Upload
Outras considerações:
- GIFs são do mal. Quando possível, não
aceite;
- O velho getimagesize(); é burlável
(por GIFs, inclusive!)
Vamos lá!
• OWASP
• SQL Injection
• XSS
• CSRF
• File Upload
• Path Traversal
Path Traversal
Imponha limites.
Path Traversal
Você recebe o caminho de um arquivo, e executa
alguma ação com isso.
http://www.site.com/download.php?arquivo=carro.jpg
Path Traversal
O que você recebe como parâmetro está em um
diretório específico, construído para esse fim.
Path Traversal
Mas eis que surge o “ZzboladozZ”...
http://www.site.com/download.php?arquivo=../../../../etc/shado
w
Path Traversal
É necessário impor limites, não deixar que o usuário
vá a qualquer lugar do sistema. Ele só pode inserir o
nome do arquivo, e não um caminho.
Path Traversal
Simplesmente não.
Path Traversal
Simples como isso, sem REGEX.
Dessa forma, ../../../anything vira só anything, e
nenhum arquivo indevido é acessado.
Path Traversal
1. Quando possível, pode usar identificadores
numéricos para os arquivos, e não caminhos.
Path Traversal
Não funciona para poucos casos, como arquivos Phar.
E realpath requer que o caminho exista (caso não
exista, retorna falso).
2. Caso queira que sejam permitidos diretórios no
caminho, mas só “abaixo”, pode usar o
Obrigado :-)

Segurança em PHP: O que você precisa saber