Este documento fornece dicas sobre como tornar aplicações PHP mais seguras, abordando tópicos como: 1) filtrar todas as entradas para evitar SQL injection e outros ataques; 2) escapar todas as saídas para evitar erros de renderização; 3) usar criptografia forte para dados sensíveis. O objetivo é ajudar desenvolvedores a corrigirem vulnerabilidades comuns e blindarem seu código.
4. Simplicidade != vulnerabilidade
PHP é “fácil” de aprender? SIM!
PHP é a “primeira linguagem” de muitos
desenvolvedores? SIM
Devido a estes fatos, muitas aplicações
possuem vulnerabilidades consideradas
básicas. Mas que podem dar muita dor
de cabeça!
6. Planejamento
“Prevenir é melhor do que remediar”
Leve em consideração
falhas de segurança;
Não deixe para pensar
em segurança depois de
tudo pronto;
Crie um fluxograma ou
mapa mental das
entradas fornecidas pelo
usuário e verifique onde
podem ser
interceptadas;
7. Procure boa documentação e
fontes de pesquisas
PHP.NET (The Best)
OWASP.org (*top 10)
PHPSEC.org (*artigos)
FORUM-SEGURANÇA.com
9. Mostrando erros
Configurações relacionadas a exibição de erros:
error_reporting() – nível de erro a ser reportado.
Padrão: E_ALL ^ E_NOTICE
display_errors: exibir ou não erros na tela
Em produção, deve ser sempre desabilitada
log_errors: fazer log dos erros em arquivos
error_log: arquivo onde será feito o log
15. Cuidados com sua URL
Práticas de SEO lhe ajudarão
no combate a SQL Injection!
16. http:/meusite.com.br/?pagina=produtos.php&id=12
ou
http://meusite.com.br/produtos/miniatura-sheldon-cooper
URLS amigáveis ajudam bastante por conta da
“validação” que o .HTACCESS pode fazer para você
através de expressões regulares, resultando erro 404 ao
invés de fazer a requisição para seus arquivos .PHP
18. O Que é?
Injeção de instruções sql normalmente em
campos de formulário com o intuito de
conseguir acesso a informações ou alterações
na base de dados.
Como evitar ou corrigir?
Simples: Como quase todas as falhas de
segurança, basta filtrar entradas e escapar
saídas
19. Nunca conecte ao banco de dados
como um super-usuário (root), sempre
utilize usuários personalizados, sem que
tenha acesso a tudo do banco.
O PHP oferece diversas funções para
evitar ataques por SQL injection:
mysql_real_escape_string(),
sqlite_escape_string(), addslashes() e
str_replace(), PDO:quote().
23. Aplicando criptografia
• Extensões de criptografia php (algumas):
• Hash
• Mcrypt
• OpenSSL
SHA-1 é praticamente idêntico ao md5, só que tem 160 bits, o
que acaba criando uma string-resultado maior (40 char.)
Aplicando:
$string = 'O rato roeu a ropa do rei de Roma’;
$codificada = sha1($string);
echo "Resultado da codificação usando sha1: " . $codificada;
// b186b709f7cf5a1d98d413379a66e511df8d59a4
24. $_REQUEST nunca mais!
Utilize adequadamente $_GET,$_POST e
$_COOKIE;
Esta técnica XGH não vai melhorar em nada
sua vida ;)
*XGH = Xtreme Go Horse Process
25.
26. Não passe informações importantes por
GET
Trate todo e qualquer dado que você
utilize para tomar decisões ou exibir
informações da base de dados
Visualize as possíveis brechas de
segurança e implemente uma solução
simples para elas.
Não reinvente a roda. Utilize um
framework sempre que possível
(normalmente já implementada a
camada de segurança)
Utilize um bom anti-vírus
28. OBRIGADO!
Ficou com dúvidas?
Entre em contato pelo twitter
@gustavodasneves
Hinweis der Redaktion
Antes de iniciar… fica a pergunta: passa para o próximo slide
Próximo: Por onde começar?
No próximo slide tem o exemplo sobre carregar arquivos via get
Não é a maior falha de segurança, porém é muito importante que você se preocupe em não mostrar seus arquivos e muito menos impedir que usuários tenham acesso direto a arquivos de script e outros
Não é a maior falha de segurança, porém é muito importante que você se preocupe em não mostrar seus arquivos e muito menos impedir que usuários tenham acesso direto a arquivos de script e outros
No próximo slide tem o exemplo sobre carregar arquivos via get
No próximo slide tem o exemplo sobre carregar arquivos via get