segurança em php - blinde seu código de você mesmo!
DESCRIPTION
Palestra apresentada por mim no PHPSC 2012 em São José, na Univali. Palestra de nível básico mas que tem algumas dicas bastante legais!TRANSCRIPT
Segurança em PHPBlinde seu código de você mesmo!
@gustavodasneves
facebook.com/gustavo.nevesgn
gustavo.masterstudioweb.com
www.gustavoneves.com
Sua aplicação é segura?
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!
Por onde começar?
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;
Procure boa documentação e fontes de pesquisas
PHP.NET (The Best)
OWASP.org (*top 10)
PHPSEC.org (*artigos)
FORUM-SEGURANÇA.com
Vamos ao que interessa!
Mostrando erros
Configurações relacionadas a exibição de erros:error_reporting() – nível de erro a ser
reportado. Padrão: E_ALL ^ E_NOTICEdisplay_errors: exibir ou não erros na tela
Em produção, deve ser sempre desabilitadalog_errors: fazer log dos erros em arquivoserror_log: arquivo onde será feito o log
Manipulando errosset_error_handler() – permite usar uma função
própria para o tratamento de erros
set_exception_handler()
TODA ENTRADA DEVE SER FILTRADA E TODA SAÍDA DEVE SER ”ESCAPADA”
filter_input()
Filtrando as entradas
Problemas comuns em aplicações
Cuidados com sua URLPráticas de SEO lhe ajudarão
no combate a SQL Injection!
http:/meusite.com.br/?pagina=produtos.php&id=12
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
ouhttp://meusite.com.br/produtos/miniatura-sheldon-
cooper
SQL InjectionO lado negro da força
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
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().
Confiar no usuárioTrate os dados e reze para que ele não seja
“malandro” demais
Veja esta singela mensagem de erro:
Hey Sheldon, sua senha está incorreta!
*Não informe dados de usuários ou da aplicação em mensagens de erro!
CriptografiaEmbaralhe, embaralhe e embaralhe
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
Utilize adequadamente $_GET,$_POST e $_COOKIE;
Esta técnica XGH não vai melhorar em nada sua vida ;)
*XGH = Xtreme Go Horse Process
$_REQUEST nunca mais!
Dicas “quentes”
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
Para finalizar:
Nenhuma aplicação é 100% segura!
OBRIGADO!
Ficou com dúvidas? Entre em contato pelo twitter
@gustavodasneves