programando php com mais segurança
TRANSCRIPT
PROGRAMANDO PHP COM MAIS Segurança
Programando PHP Com Mais Segurança!
Nome: Michael AraújoJulho/2016
CONHECENDO O PALESTRANTE
Criador e mantenedor:
https://www.facebook.com/groups/silexbrasil https://www.facebook.com/groups/laravelsp https://www.facebook.com/groups/doctrinebrasil https://www.facebook.com/group/sonicpibrasil
Instrutor:
4 Linux Webschool.io
CONHECENDO O PALESTRANTE
https://github.com/michaeldouglas
https://twitter.com/mdba_araujo
https://facebook.com/mdba.araujo
CONHECENDO O PALESTRANTE
Livro: Zend Certified Engineer - Descomplicando a certificação PHP.
LARAVEL PAGSEGURO
Laravel Pagseguro
https://github.com/michaeldouglas/laravel-pagseguro
LARAVEL CONFERENCE BRASIL
Laravel Conference Brasil
http://laraconfbrasil.com.br
Data do Evento:
08 de Outubro de 2016
Serão sorteados 2 ingressos:
Combinado hoje iremos verificar com a
PHP SP :) - By Marcelo!
INTRODUÇÃO
PHP é uma linguagem poderosa e sua curva de aprendizagem é mais curta!
INTRODUÇÃO
Programadores que estão iniciando se preocupam mais em criar belas estruturas de sistemas, cruds e etc.
INTRODUÇÃO
Segurança, por que é um assunto que normalmente fica para o final do projeto?
INTRODUÇÃO
Prazo curto, segurança de menos!
PHP.INI EM DETALHES
PHP.ini não apenas um arquivo a ser ignorado!
PHP.INI EM DETALHES
PHP possui alguns recursos dinâmicos que podem ser interessantes porem trazem consigo alguns potenciais riscos, por exemplo, controle de gravação de arquivos.
PHP.INI EM DETALHES
A grande questão fica no que devemos limitar em nossa configuração do arquivo php.ini.
PHP.INI EM DETALHES
Mais uma questão que fica, devemos virar especialistas de arquivo php.ini, Alguns exemplos!
ALLOW_URL_FOPEN E ALLOW_URL_INCLUDE
● Permite que arquivos que não estão no mesmo servidor da sua aplicação possam incluir arquivos.
● Então, se eu precisar habilitar ? ○ allow_url_fopen = On○ allow_url_include = On
● E com esse simples exemplo, podemos ter problemas com: RFI (Remote File Inclusion).
MAX_EXECUTION_TIME E MAX_IMPUT_TIME
● Configurações que determinam em segundos o quanto seus scripts estão permitidos a executar.
● Max_execution_time: Tempo máximo, em segundos.● Max_input_time: Tempo máximo, em segundos, que um script está
permitido a interpretar, por exemplo, GET E POST. ○ max_execution_time = 30○ max_input_time = 60
UTILIZAÇÃO DE MEMÓRIA
● Configurações de limite de memória determinam o máximo de memória que seu script poderá alocar.
● Ajuda você a mitigar um problema onde o invasor tenta consumir toda a memória do seu servidor. Exemplos:○ memory_limit = 16M○ upload_max_filesize = 2M○ post_max_size = 8M○ max_input_nesting_levels = 64M
Configurações do PHP um mundo a ser explorado !
CRIPTOGRAFIA DE DADOS
● O ganho que possuímos com criptografia é que protegemos nossa informação de um invasor. Ou seja, agora, para o invasor decodificar esses dados, ele precisará conhecer o padrão de criptografia que foi usado.
● Uma das criptografias mais famosas é o MD5.● Porém será que só ao utilizar MD5 já estou com senhas seguras?● Existe um site: https://hashkiller.co.uk/md5-decrypter.aspx ela
quebra todos os tipos de cálculo de hash MD5?
MD5
● Trabalha com um algoritmo conhecido como RSA Data Security.● O RSA aplicado a uma quantidade arbitrária de dados gera um hash
de tamanho fixo de 128 bits.● Em php para utilizar a função: md5().● Hash Md5 123456: e10adc3949ba59abbe56e057f20f883e● Facilmente hashkiller saberá sua senha:
https://hashkiller.co.uk/md5-decrypter.aspx
SHA1
● Mais um algoritmo muito utilizado por desenvolvedores PHP.● Para utilizar em PHP basta chamar a função sha1().● Hash sha1 123456: 7c4a8d09ca3762af61e59520943dc26494f8941b● Facilmente hashkiller saberá sua senha:
https://hashkiller.co.uk/sha1-decrypter.aspx
● MD5 e SHA1, pode ser bem prático, porém não tende a ser tão seguro da forma que o implementamos!
PASSWORD SALT
● Técnica que ajuda a melhor a segurança dos cálculos de Hash MD5, SHA1 e etc.
● Gera uma lógica que apenas o seu sistema conhece e que saiba descriptografar.
● Só de implementar SALT em minhas senhas já posso dormir tranquilo?
● Não! Pois o invasor pode descobrir através das seguintes formas:○ O salt presente em um arquivo de configuração.○ O salt presente no banco de dados.○ O atacante pode gerar uma Rainbow Table.
RAINBOW TABLE
● Consiste em uma tabela (como a de um banco de dados) que o invasor cria para realizar consultas de transação na memória RAM.
● Os resultados computados serão armazenados nessa tabela e, com isso, ele pode descobrir seu algoritmo de hash.
● Programas que fazem Rainbow Table:○ http://rainbowtables.shmoo.com○ http://ophcrack.sourceforge.net
SALT EXEMPLO MD5
VERIFICAÇÃO DO SALT - EXEMPLO MD5
SALT DINÂMICO
● O ideal é que você não deixe o hash de suas senhas fixas.● Solucionar o problema não é tão complexo assim!● A solução é unir um salt dinâmico com nosso hash de senha.● A cada nova requisição de criação de senha, ou atualização, seu
sistema gera um novo padrão para o nosso usuário.
SALT DINÂMICO EXEMPLO
SALT DINÂMICO EXEMPLO
SALT DINÂMICO EXEMPLO
SALT DINÂMICO EXEMPLO
SALT DINÂMICO ACHEI MUITO COMPLICADO!
PASSWORD HASHING API
● Ainda bem que existe password_hash().● O segundo parâmetro é algoritmo a ser utilizado para o cálculo de
hash que são:○ PASSWORD_DEFAULT - Usa o algoritmo bcrypt○ PASSWORD_BCRYPT - o algoritmo utilizado será o
CRYPT_BLOWFISH
PASSWORD HASHING - PASSWORD_HASH
PASSWORD HASHING - PASSWORD_HASH
PASSWORD HASHING - HASH 666 ?
ENTENDI ESSE TAL DE PASSWORD HASH!
E COMO VERIFICAR A SENHA DO USUÁRIO?
PASSWORD_VERIFY
CROSS-SITE SCRIPTING
● Alguns conhecem o ataque XSS (Cross-site scripting) mas não se importam muito.
● Java script é inofensivo não preciso ficar preocupado com isso!● E se o invasor conseguir a sessão do seu usuário?
CROSS-SITE SCRIPTING
CROSS-SITE SCRIPTING
● Agora que ele obteve o PHPSESSID já se tornou seu usuário!
CROSS-SITE SCRIPTING
● O maior problema de segurança que você provavelmente terá é sua confiança no usuário.
FILTROS DE DADOS
FILTROS DE DADOS
FILTROS DE DADOS - COMO UTILIZAR?
● Utilizando filter_input()● Constantes aceitas:
○ INPUT_GET○ INPUT_POST○ INPUT_COOKIE○ INPUT_SERVER○ INPUT_ENV○ INPUT_SESSION
FILTER_INPUT
FILTROS DE DADOS - COMO UTILIZAR?
● Utilizando filter_var()● Constantes aceitas:
○ FILTER_VALIDATE_EMAIL○ FILTER_VALIDATE_URL○ FILTER_VALIDATE_BOOLEAN○ FILTER_VALIDATE_FLOAT○ FILTER_VALIDATE_INT○ FILTER_VALIDATE_IP○ E entre outros:○ http://php.net/manual/en/filter.filters.validate.php
FILTER_VAR
DÚVIDAS ?
Obrigado!